ďťż
 
[PostgreSQL] Funkcje w C i dostęp do plików - bug?? ďťż
 
[PostgreSQL] Funkcje w C i dostęp do plików - bug??
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • oefg.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com