UnixMountainSkiFun

Unix Горы Лыжи

20-06-2008 15:17

UDF srccpk


Данный текст возможно будет интересен тем любителям Open Source, которые предпринимают попытки переноса семантической базы данных ПК ЕГРЗ-Т.03.015.x, под управлением Interbase, на UNIX-платформу.

Известно, что при переносе семантической Interbase базы данных на UNIX-платформу, потребуется "разжиться" как минимум одной из UDF, написанной специалистами Филиала ФГУП "ФКЦ "Земля" по ЮФО -- srccpk. Данная UDF ответственна за генерацию первичных ключей для всех таблиц схемы SYSDBA. Ниже следует исходный текст UDF, который был заново переписан мной, при помощи Максима Михеенко.

Алгоритм спорный, однако из песни слов не выкинешь -- это, на данный момент, единственное чем я владею.

Исходный код:

 /*-------------------------------------------*/
 /* SRCCPK UDF                                */
 /*                                           */
 /* c 2005 Xoxa & Max & SRCC Development Team */
 /* <support@valley.ttn.ru                    */
 /*-------------------------------------------*/

 #include <stdio.h>
 #include <time.h>

 // Implementaion SRCCPK-UDF
 void GetNormPK (int* Num, char* Result)
 {
   char basis[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
   int basisLen = strlen (basis);
   char* pbuff = Result;

   // Getting and parsing current date
   time_t Now = time (NULL);
   struct tm * timeinfo = localtime (&Now);
   *pbuff++ = basis[(timeinfo->tm_year + 1900) % basisLen];
   *pbuff++ = basis[timeinfo->tm_mon % basisLen];
   *pbuff++ = basis[timeinfo->tm_mday % basisLen];

   // Coding Time + Numeric
   sprintf(pbuff, "%03x", timeinfo->tm_hour * 60 + timeinfo->tm_min);
   pbuff += 3;
   sprintf(pbuff, "%04x", *Num % 0xffff);
 };

Собираем так:

 gcc -c -O -fpic -fwritable-strings srccpk.c
 ld -G -lm -lc srccpk.o -o SRCCPK.so

Регистрируем в Interbase базе данных так:

 drop external function GetNormPK;
 declare external function GetNormPK integer, cstring(11) returns parameter 2
 entry_point 'GetNormPK' MODULE_NAME 'SRCCPK';
 commit;

<< | Наши проекты | Data Munging With Perl >>


edit RightSideBar