[PostgreSQL] Funkcje w C i dostęp do plików - bug??
3.14otrek - 13-02-2006 10:31
[PostgreSQL] Funkcje w C i dostęp do plików - bug??
Witam!
Problem dotyczy Stored Procedures napisanych w C dla PostgreSQL w wersji dla Windows (nie wiem czy ten sam problem wystepuje pod Linuxem), które otwierają pliki do odczytu.
Mam stworzoną dllke która zawiera funkcje próbującą otworzyć plik do odczytu w trybie binarnym. Jeśli jej się to powiedzie zwraca stringa o treści "OK", w przeciwnym razie "ERROR".
Gdy w danej sesji wywołam tą funkcje kolejno:
SELECT test_open_file('d:/test.jpg') //plik 'd:/test.jpg' istnieje (funkcja zwraca: "OK")
SELECT test_open_file('d:/abc.jpg') //plik 'd:/abc.jpg' NIE istnieje (funkcja zwraca: "ERROR")
SELECT test_open_file('d:/test.jpg') //plik 'd:/test.jpg istnieje (funkcja zwraca: "ERROR" , a powinna "OK" ponieważ plik ten istnieje).
Od tego momentu nie ma siły aby ponownie otworzyć plik 'd:/test.jpg', funkcja stale zwraca komunikat 'ERROR'. Musze otworzyć nową sesje aby móc ponownie otworzyć ten plik.
Prosze o pomoc. Gdzie jest błąd...a moze to bug Postgresa??
Oto kod programu oraz link do projektu zawierającego kod SP (projekt pod CODE::BLOCKS)
Link: http://www.tpsteam.cba.pl/uploads/up...test_fopen.zip
------------CODE-------------------
#include <postgres.h>
#include <fmgr.h>
PG_FUNCTION_INFO_V1(test_open_file);
Datum test_open_file (PG_FUNCTION_ARGS)
{
text *filepath = PG_GETARG_TEXT_P(0);
FILE *file = NULL;
text *opening_status;
/*wyciagam scieżke do pliku i dodaje znak konca stringu '\0'*/
char *name = palloc(filepath->vl_len * sizeof(char)+1);
int m;
for(m = 0; m < filepath->vl_len; m++)
{
name[m] = filepath->vl_dat[m];
}
name[filepath->vl_len] = '\0';
/*proba otwarcia pliku*/
if ((file = fopen (name, "rb")) == NULL)
{
opening_status = palloc(VARHDRSZ+5);
strncpy(opening_status->vl_dat, "ERROR", 5);
opening_status->vl_len = VARHDRSZ+5;
}
else
{
fclose (file);
file = NULL;
opening_status = palloc(VARHDRSZ+2);
strncpy(opening_status->vl_dat, "OK", 2);
opening_status->vl_len = VARHDRSZ+2;
}
pfree(name);
name = NULL;
PG_RETURN_TEXT_P(opening_status);
}
-----------------END CODE-----------------------------------
Funkcja została utworzona poleceniem:
CREATE OR REPLACE FUNCTION "test_open_file" (filepath text) RETURNS text AS
'test_open_file'
LANGUAGE 'c' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
3.14otrek - 14-02-2006 09:37
Przeczytałem powyższego posta i stwierdziłem, że trochę w nim namieszałem:-/ Ok...rzucę na to troszkę światła bo zależy mi bardzo na tym by ktoś mi pomógł. mecze się już z tym kilka dni bezskutecznie :(
Mam funkcje napisana w C, która otwiera plik do odczytu .wczytuje plik . a następnie go zamyka. Wynik funkcji to informacja o tym czy proces otwarcia pliku się powiódł (OK/ERROR). Funkcja ta jest wykorzystana do stworzenia funkcji po stronie serwera. Jako parametr przyjmuje ścieżkę do w/w pliku . Ogólnie taka funkcja zadziała poprawnie tylko raz w danej sesji. Pod warunkiem, że w jej pierwszym wykonaniu podamy ścieżkę do istniejącego pliku, a w drugim do nieistniejącego pliku.
Select my_open_file('d:/file.bin') //OK Select my_open_file('d:/bleble.bin') //ERROR
Od tego momentu funkcja przestaje działać poprawnie.pomimo tego, że podaje ścieżkę do istniejącego (tego samego co w pierwszym wywołaniu!!!) pliku. Funkcja zachowuje się tak jak by pliku nie było.
Select my_open_file('d:/file.bin') //ERROR a powinno byc OK
Próbowałem już chyba wszystkiego. Zamieniałem funkcje fopen na open i _open (a także AllocateFile). Nic nie pomaga :( Sprawdzałem także czy plik jest poprawnie zamykany.okazało się, że tak. Cala ta niemiła sytuacja zachodzi na Postgresie pod win32.
Bardzo proszę o pomoc.
Piotrek
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
postgresql Select count(*) czy raczej Select count(ID)
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
=?ISO-8859-2?Q?[psql]_Polskie_t=B3umaczenie_?= =?ISO-8859-2?Q?licencji_BSD_dla_PostgreSQL=3F?=
[firebird] Czym =?ISO-8859-2?Q?zast=B1pi=E6_postgresowy_inte?==?ISO-8859-2?Q?rval_=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.ploefg.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|