Библиотека функций rFunc для IB DataBase
(версия 2.0.1)

    Библиотека представляет собой набор пользовательских (UDF) строковых, битовых, числовых функций, а также для работы с датами и BLOBами. А также ПАРСЕР, т.е. вычислитель выражений. Поддерживаются IB Database 4.2, 5.x, 6.0 (Windows 9x, NT, 2k) и IB Database 5.x, 6.0 (Linux). В ее состав входит более 90 функций и "псевдофункций" (это когда несколько строковых UDF имеют одну базовую функцию, в основном это функции с именем LongXXXX). Библиотека написана на С++ и поставляется с исходными текстами.

Порядок компиляции и установки описан в файле readme.txt (readme.linux) из состава дистрибутива.

функции

Условные обозначения:
f параметр типа DOUBLE PRECISION
si параметр типа SMALLINT
i параметр типа INTEGER
d параметр типа DATE для IB4.2, IB5.x или TIMESTAMP для IB6
s параметр типа VARCHAR(255)
c параметр типа VARCHAR(1)
s' параметр типа VARCHAR(8)
s" параметр типа VARCHAR(32)
S параметр типа VARCHAR(16383)
S** параметр типа VARCHAR(8127) для IB4.2 или VARCHAR(16383) для IB5.x и IB6
B параметр типа BLOB

Функция Тип Возвращает
Числовые
Abs(f) f Модуль числа
Ceil(f) f Минимальное большее целое
Floor(f) f Максимальное меньшее целое
MaxNum(f,f) f Большее из чисел
MinNum(f, f) f Меньшее из чисел
Power(f1, f2) f Число f1 в степени f2
Round(f, i) f Округленное значение f до i знаков, причем при i>0 округляется дробная часть, а при i<0 - целая
SoftRound(f, i) f Аналогично Round, но если результат округления равен 0, то округление не производится.
Z(f) f Если параметр имеет значение NULL, то 0. Во всех остальных случаях возвращается то, что передается.
IIf(i1, i2, i3) i Если i1=0, то i3, в остальных случаях - i2
DIf(i, f1, f2) f Если i=0, то f2, в остальных случаях - f1
DZero(f1, f2, f3) f Частное f1 и f2. Если f2=0, то возвращает f3.
CalcExpr(S, S)

Пример:
CalcExpr('Sin( Pi*:p11/3)*:P2', 'P11=2;P2=10')
f Простенький анализатор выражений.
Поддерживаемые функции и операции

+ - * /
Sin, Cos, tg, ctg, ArсCos, ArcSin, ArcTg, sh, ch, th,
exp, lh, lg, sqrt, sqr, abs(x1)
sgn(x1) - знак числа x1
log(x1,x2) - логарифм x1 по основанию x2
power(x1,x2) - возведение x1 в степень x2
if(expr, x1, x2) - если expr=0, то x2, иначе x1
Min(x1, ...) - минимум из чисел
Max(x1, ...) - максимум из чисел
Sum(x1, ...) - суммирование аргументов
Avg(x1, ...) - среднее арифметическое
Pi - число Pi.

     Для использования переменных в выражении - перед ними ставится двоеточие, и они описываются во втором параметре (см. пример).

ExprIsValid(S, S) i Проверка на корректность заданного выражения. Возвращает 0, если все правильно, иначе - код ошибки.
Div(i1, i2) i Целое частное i1 и i2
Mod(i1, i2) i Остаток от деления i1 на i2
InitRandom(i) i Инициализация генератора псевдослучайных чисел.
GetRandom(i) i Псевдослучайное число в диапазоне 0..i.
Строковые
Chr(si) c Символ по коду
Ord(c) si Код символа
StrReplace(s1, s2, s3) s Заменяет в строке s1 подстроку s2 на s3
LongStrReplace(S1, S**2, S**3) S
StrStuff(s1, i1, i2, s2) s В строке s1 удаляет i2 символов, начиная с i1, и вставляет на это место s2
LongStrStuff(S1, i1, i2, S2) S
LTrim(s) s Удаляют пробелы слева
LongLTrim(S) S
RTrim(s) s Удаляют пробелы справа
LongRTrim(S) S
StrLen(S) i Длина строки
StrPos(s1, S2) i Позиция строки s1 в строке s2. Если не найдено, то 0.
StrRepeat(s, i) s Дублирует строку s i раз
LongStrRepeat(S, i) S
SubStr(s, i1, i2) s Подстрока строки s, начиная с символа i1 и длиной максимум i2.
i1 < 0 - отсчет происходит с конца строки,
i2 < 0 - выводятся символы слева от точки отсчета.
LongSubStr(S, i1, i2) S
Trim(s) s Удаляют все пробелы справа и слева
LongTrim(S) S
CIf(i, s1, s2) s Если i=0, то s2, в остальных случаях - s1
LongCIf(i, S1, S2) S
StrCount(s1, S2) i Количество вхождений s1 в S2
WordCount(S, s", si) i Количество слов в строке S, разделенных символами из строки s". Если si<>0, то несколько разделителей подряд считаются словом.
WordNum(S, i, s", si) s i-ое слово в строке S, разделенных символами из строки s". Если si<>0, то несколько разделителей подряд считаются словом.
LongWordNum(S, i, s", si) S
RLower(s) s Строка в нижнем регистре (WIN1251)
LongRLower(S) S
RUpper(s) s Строка в верхнем регистре (WIN1251)
LongRUpper(S) S
PadLeft(s, i, c) s Дополняет строку s до длины i символом c слева.
LongPadLeft(S, i, c) S
PadRight(s, i, c) s Дополняет строку s до длины i символом c справа.
LongPadRight(S, i, c) S
RLatin(s) s Заменяет символы из win1251 на "похожие" из латиницы.
LongRLatin(S) S
RTranslit(s) s Транслитерация из win1251 в латиницу.
LongRTranslit(S) S
Даты
DateToStr(d, s)

Примеры: DateToStr('10.02.99','%d.%m. %y') = '10.02.99' DateToStr('10.02.04 08:23','%d %B %Y, %X') =
'10 February 2004, 08:23:00'
s
Преобразование даты d в строку по формату s.
Строки форматирования
(соответствуют с-функции strftime):

%% - символ %,
%c - дата и время,
%x - дата,
%d - день месяца (01-31),
%j - день года (000-366),
%w - день недели (0-6), 0 - воскресенье,
%U - номер недели в году (00-53), воскресенье - первый день недели,
%W - номер недели в году (00-53), понедельник - первый день недели,
%a - краткое название дня недели,
%А - полное название дня недели,
%m - месяц (01-12),
%b - краткое название месяца,
%B - полное название месяца,
%y - год (00-99),    %Y - четырехзначный год,
%X - время,
%H - час (00-23),   %I - час (01-12),
%M - минута (00-59),
%p - AM или PM,
%S - секунда (00-59).

DayPerMonth(i1, i2) i Число дней в i1 месяце i2 года
Dow(d) i День недели
EncodeDate(i1, i2, i3) d Дата по формату i1.i2.i3 = дд.мм.гггг
EncodeDateTime(i1, i2, i3, i4, i5, i6) d Дата и время по формату
i1.i2.i3 i4:i5:i6 = дд.мм.гггг чч:мм:сс
ExtractDate(d) d Из даты+времени выделяет чистую дату
Day(d) i День даты [только IB 4.2 и 5.x]
Month(d) i Месяц даты [только IB 4.2 и 5.x]
Year(d) i Год даты [только IB 4.2 и 5.x]
Hour(d) i Часы из даты [только IB 4.2 и 5.x]
Minute(d) i Минуты из даты [только IB 4.2 и 5.x]
Second(d) i Секунды из даты [только IB 4.2 и 5.x]
WeekDay(d) i День недели [только IB 4.2 и 5.x]. Аналогична DOW.
YearDay(d) i День года [только IB 4.2 и 5.x]
Quarter(d) i Квартал года
FirstDayMonth(d) d Первый день месяца
LastDayMonth(d) d Последний день месяца
IsLeapYear(i) i 1 - високосный год, 0 - невисокосный
DaysBetween(d, d) i Количество дней между датами
DtIf(i, d1, d2) d Если i=0, то d2, в остальных случаях - d1
IncDate(d, i1, i2, i3) d Изменение даты на i1 дней, i2 месяцев, i3 лет.
BLOB
B_Line(B, i) s i-я строка B
B_LongLine(B, i) S
B_Line_Count(B) i Количество строк
B_Max_Segment(B) i Максимальная длина сегмента
B_Number_Segments(B) i Количество сегментов
B_Put_Segment(S) B Запись сегмента в blob-поле (пример см. в rtest.sql)
B_SubStr(B, i1, i2) s Аналогичны SubStr
B_LongSubStr(B, i1, i2) S
B_Total_Length(B) i Количество байтов в B
Битовые
BitAnd(i1, i2) i i1 and i2
BitNot(i) i not(i)
BitOr(i1, i2) i i1 or i2
BitXor(i1, i2) i i1 xor i2
GetBit(i1, i2) i i2-й бит числа i1
SetBit(i1, i2, i3) i Заменяет i2-й бит числа i1 на i3. i3 может принимать значения 0 и 1.
API

Add_User(i, s, s"1, s'1, s"2, s"3, s"4, s"5, s"6, s'2)

Пример:
Add_User(1, 'ibserver', 'name', 'password', '', 'alex', 'v', 'petrov', 'sysdba', 'masterke')

i Добавление и изменение свойств пользователя. API IB Database. Добавляет (изменяет) пользователя с именем s''1 на сервере s из UNIX-группы s''2. Соединение производится по протоколу i (1-TCPIP, 2-NetBEUI, 3-SPX, 4-локально) пользователем s''6 с паролем s'2. Параметры: s'1 - пароль, s''3 - имя, s''4 - отчество, s''5 - фамилия. Возвращает код завершения (0-нормальное). [только IB 5.x и выше]
Modify_User(i, s, s"1, s'1, s"2, s"3, s"4, s"5, s"6, s'2) i
Delete_User(i, s, s"1, s"6, s'2) i Удаление пользователя. API IB Database. удаляет пользователя с именем s''1 на сервере s. Соединение производится по протоколу i (1-TCPIP, 2-NetBEUI, 3-SPX, 4-локально) пользователем s''6 с паролем s'2. [только IB 5.x и выше]
MsgBox(S, s, i) i Окно сообщения с возможностью выбора. Не рекомендуется использовать на удаленных серверах. API Windows. Выводит окно с заголовком s и текстом S. [только для Windows]

история изменений

По всем вопросам, связанным с rFunc UDF Library, обращайтесь по адресу rFunc@mail.ru

Copyright © 2001 Polaris Software