powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сишные хранимки под PostgreSQL 8.1 (Win)
9 сообщений из 9, страница 1 из 1
Сишные хранимки под PostgreSQL 8.1 (Win)
    #34566616
Roorkee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Есть необходимость обрабатывать бинарные массивы, хранящиеся в файлах и результаты (обработано/не обработано) заносить в таблицу. Обработка массивов весьма нетривиальна, поэтому не вижу выхода, кроме как использовать сишный код.

Под Linux все понятно, генирится .so, затем известным образом подключается как хранимка.
А как дело обстоит под Windows? Кто-нибудь сталкивался?
Подозреваю, что dll поможет, хотя в документации к PostgreSQL 8.1 упомянуты только Unix-клоны.
Среда разработки - Borland C++ Builder 6, если что.
...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #34568877
tkopets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можешь скомпилить с помощью MinGW - www.mingw.org .

Можно использовать примеры с мануала PostgreSQL.

Чтоб скомпилить тебе нужно будет MinGW+MinSYS:

MinGW в С:\MinGW с следующими модулями:
mingw-runtime-3.9.tar.gz
gcc-core-3.4.2-20040916-1.tar.gz
binutils-2.15.91-20040904-1.tar.gz
mingw32-make-3.80.0-3.tar.gz
w32api-3.7.tar.gz

И MinSYS в С:\msys:
MSYS-1.0.10.exe

Наверно уже давно есть более новые версии MinGW и MinSYS.

Еще тебе нужно будет *.h файлы (include директория в PostgreSQL):
Я себе сделал такие директории:
[e:\pg]
[e:\pg\cdev]
и скопировал директорию [include] (опционально можно поставить при устанавке PostgreSQL) в моем случае это [c:\Program Files\PostgreSQL\8.1\] to [e:\pg\cdev\].
Можеш пропустить этот шаг, но потом тебе прийдется писать полный путь к твоей папке [include] (может даже в кавычках c:\Program Files\PostgreSQL\8.1\include ?).

Чтоб у меня скомилилось я поменял: [#define ENABLE_NLS 1]
на [#undef ENABLE_NLS] в файле e:\pg\cdev\include\pg_config.h

Файл с моим кодом: [e:\pg\cdev\writetofile.c].

Запустить MinSYS и скомпилить:
[gcc -c e:/pg/cdev/writetofile.c -o e:/pg/cdev/writetofile.o -I e:/pg/cdev/include -I e:/pg/cdev/include/server -I e:/pg/cdev/include/server/port/win32]
(без [], помни, что нужно юзать / вместо \)
в результате у меня появился object файл [e:\pg\cdev\writetofile.o].

Чтоб достать с него "DLL" который можно будет подключить к PostgreSQL:
[gcc -shared e:/pg/cdev/writetofile.o -o e:/pg/cdev/writetofile.dll -L "C:/Program Files/PostgreSQL/8.1/lib" -lpostgres]

В результате достаешь файл [e:\pg\cdev\writetofile.dll].
Копируешь в lib директорию PostgreSQL [C:\Program Files\PostgreSQL\8.1\lib].

Последнее что осталось сделать, это создать функцию в PostgreSQL которая будет использовать код написаний на С.
Делаем с помощью SQL кода:
Код: plaintext
1.
2.
CREATE FUNCTION writetofile(text, text) RETURNS integer
     AS '$libdir/writetofile', 'writelog_tofile'
     LANGUAGE C STRICT;


_____________________________________
Sorry for my Russian, if it is not OK
...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #34571053
Roorkee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за подробный ответ!
...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #34576234
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoorkeeБольшое спасибо за подробный ответ!

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

далее кладёте либо её по путям дефолтного поиска (в настроечном файле можно добавить новый путь)...либо явно в описании указываете полный путь. рекомендую путь отличный от пути компиляции - это чтоб при зависании, компилировалась дэлеле. можно так же её отлаживать. ставите внутри кода азмовский бряк int 3h, запускаете отладчик на процесс...

по поводу самого программирования на стороне сервака - рекомендую достать исходники самого постгресса и посмотреть по образу и подобию..многие весчи как примеры там можно найти.

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #34576423
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы предложил добывить всю это инфу в FAQ
...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #34598525
RRanger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы присоединился к предложению товарища Niemi.
...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #35279063
flyasky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня выскакивает ошибка при линковке:

D:\users\anthony\kursor\abzcrm\c\foo>gcc -shared foo.o -o foo.dll -L "d:/files/local/PostgreSQL/8.3/lib" -l postgres
Cannot export ⌂postgres_NULL_THUNK_DATA: symbol not found
collect2: ld returned 1 exit status

хотя ⌂postgres_NULL_THUNK_DATA как-то упоминается в postgres.lib
...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #35303656
Eugene Mosyagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное ЧЕЛОВЕЧЕСКОЕ СПАСИБО господину tkopets за его ответ.
Пол дня промучася с вижуал студией, чтобы сделать свою ДЛЛку - не получалось (постгрес не признавал). C GCC - за 5 мин. прошло!
По поводу ФАК, может выложить чёто типа архивчека:

Postgres:
F:/PGSQL/

TestLIB.c:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include "postgres.h"
#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

int add_one (int arg) {
return arg +  1 ;
}

void _PG_init (void) {
}

void _PG_fini (void) {
}

Make.bat:
Код: plaintext
1.
gcc -c TestLIB.c -o TestLIB.o -I F:/PGSQL/include -I F:/PGSQL/include/server -I  F:/PGSQL/include/server/port/win32
gcc -shared TestLIB.o -o TestLIB.dll -L "F:/PGSQL/lib" -lpostgres

TestLIB.dll - ложим в F:/PGSQL/lib

TestLIB.sql:

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE FUNCTION add_one (integer) RETURNS integer
AS 'TestLIB.dll', 'add_one'
LANGUAGE C STRICT;

Select add_one ( 99 )

...
Рейтинг: 0 / 0
Сишные хранимки под PostgreSQL 8.1 (Win)
    #35303833
tkopets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всегда рад помочь
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сишные хранимки под PostgreSQL 8.1 (Win)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]