Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/02/2011, 12h10   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 1
Points : 1
Par défaut DLL pour postgreSQL : erreur violation d'accès

Bonjour,

J'en suis toujours à déboguer mon code et j'ai un gros problème : mes fonctions IN et OUT semblent faire n'importe quoi.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
// complex.cpp : Defines the exported functions FOR the DLL application.
//
 
extern "C" {
 
	#include "postgres.h"
 
	#include "fmgr.h"
	#include "libpq/pqformat.h"	/* needed for send/recv functions */
 
	PG_MODULE_MAGIC;
 
}
 
class Complex
{
public:
	void SET(double x, double y){
		this->x=x;
		this->y=y;
	}
	double get_x() {
		RETURN (x);
	}
	double get_y() {
		RETURN (y);
	}
 
private:
	double		x;
	double		y;
};
 
 
extern "C" {
 
__declspec(dllexport) Datum		complex_in(PG_FUNCTION_ARGS);
__declspec(dllexport) Datum		complex_out(PG_FUNCTION_ARGS);
 
 
/*****************************************************************************
 * Input/Output functions
 *****************************************************************************/
 
PG_FUNCTION_INFO_V1(complex_in);
 
Datum
complex_in(PG_FUNCTION_ARGS)
{
	char	   *str = PG_GETARG_CSTRING(0);
	double		x,
				y;
	Complex    *result;
 
	sscanf(str, " ( %lf , %lf )", &x, &y);
 
	result = (Complex *) palloc(sizeof(Complex));
	result->SET(x,y);
	PG_RETURN_POINTER(result);
}
 
PG_FUNCTION_INFO_V1(complex_out);
 
Datum
complex_out(PG_FUNCTION_ARGS)
{
	Complex    *complex = (Complex *) PG_GETARG_POINTER(0);
	char	   *result;
 
	result = (char *) palloc(100);
	snprintf(result, 100, "(%g,%g)", complex->get_x(), complex->get_y());
	PG_RETURN_CSTRING(result);
}
 
 
}
Le code ci-dessus est un exemple avec la classe Complex. Le code de mes fonctions IN et OUT est exactement identique à celles-ci, juste remplacer le nom de la Classe Complex par le nom de ma classe.

Or, quand je teste avec une table vide, j'insère une première ligne ce qui fait appel à la fonction IN. Je suis pas à pas avec le déboggeur tout se passe bien. Ensuite, si je veux afficher le contenu de ma table et voir la ligne que je viens d'insérer (ce qui fait appel à la fonction OUT). Je constate que les valeurs stockées n'ont rien à voir avec ce que j'ai introduit !! Visiblement, le pointeur récupéré par la fonction OUT n'est pas correct...

Mais, ce n'est là que le plus petit de mes problèmes.
En effet, quand je tente d'insérer une deuxième ligne dans ma table, encore une fois je suis pas à pas l'exécution. Tout se passe bien mais arrivé à la ligne :

Code :
PG_RETURN_POINTER(result);
Le serveur crash avec comme message d'erreur :

Code :
1
2
Exception de première chance à 0x7854464c dans postgres.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x03f2d000.
Exception non gérée à 0x7854464c dans postgres.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x03f2d000.
Je ne comprends pas ce qui se passe, ni pourquoi j'ai cette erreur avec mon code et pas avec l'exemple Complex. La seule différence que j'ai pu noter entre ma classe et la classe Complex est que ma classe hérite d'une autre classe, qui hérite elle-même d'une autre classe etc. 6 fois...

Est-ce que le problème d'allocation mémoire viendrait-il de là (héritage) ? Comment le corriger ? Svp aidez-moi car vraiment c'est un casse-tête chinois pour moi !!!
valda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 13h27   #2
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 1
Points : 1
Je ne comprends pas

J'ai modifié l'exemple Complex pour voir ce que ça donner avec un héritage et ça fonctionne toujours très bien.

Voici l'exemple complex modifié :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
// complex.cpp : Defines the exported functions FOR the DLL application.
//
 
extern "C" {
 
	#include "postgres.h"
 
	#include "fmgr.h"
	#include "libpq/pqformat.h"		/* needed for send/recv functions */
 
	PG_MODULE_MAGIC;
 
}
 
 
class ComplexX
{
public:
	ComplexX(double x){
		this->x=x;
	}
	void set_x(double x){
		this->x=x;
	}
	double get_x() {
		RETURN (x);
	}
 
private:
	double		x;
};
 
 
class ComplexY : public ComplexX
{
public:
	ComplexY(double x, double y):ComplexX(x){
		this->y=y;
	}
	void set_y(double y){
		this->y=y;
	}
 
	double get_y() {
		RETURN (y);
	}
 
private:
	double		y;
};
 
 
extern "C" {
 
__declspec(dllexport) Datum		complex_in(PG_FUNCTION_ARGS);
__declspec(dllexport) Datum		complex_out(PG_FUNCTION_ARGS);
 
 
/*****************************************************************************
 * Input/Output functions
 *****************************************************************************/
 
PG_FUNCTION_INFO_V1(complex_in);
 
Datum
complex_in(PG_FUNCTION_ARGS)
{
	char	   *str = PG_GETARG_CSTRING(0);
	double		x,
				y;
	ComplexY    *result;
 
	sscanf(str, " ( %lf , %lf )", &x, &y);
 
	result = (ComplexY *) palloc(sizeof(ComplexY));
	result->set_x(x);
	result->set_y(y);
	PG_RETURN_POINTER(result);
}
 
PG_FUNCTION_INFO_V1(complex_out);
 
Datum
complex_out(PG_FUNCTION_ARGS)
{
	ComplexY    *complex = (ComplexY *) PG_GETARG_POINTER(0);
	char	   *result;
 
	result = (char *) palloc(100);
	snprintf(result, 100, "(%g,%g)", complex->get_x(), complex->get_y());
	PG_RETURN_CSTRING(result);
}
 
}
Et voici la partie de mon code qui me pose problème :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
extern "C" { 
 
// DATE_SEC_IN
PG_FUNCTION_INFO_V1(date_sec_in);
 
Datum date_sec_in(PG_FUNCTION_ARGS)
{
	char *str = PG_GETARG_CSTRING(0);
	long y;
	UNSIGNED short m, d, h, min;
	double sec;
	d_Timepoint_sec *result;
 
	IF (sscanf(str, " ( %ld , %hu, %hu, %hu, %hu, %lf )", &y, &m, &d, &h, &min, &sec) != 6)
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
				 errmsg("invalid input syntax for date: \"%s\"",
						str)));
 
	result = (d_Timepoint_sec *) palloc(sizeof(d_Timepoint_sec));
	result->set_year(y);
	result->set_month(m);
	result->set_day(d);
	result->set_hour(h);
	result->set_minute(min);
	result->set_second(sec);
	PG_RETURN_POINTER(result);
}
 
// DATE_SEC_OUT
PG_FUNCTION_INFO_V1(date_sec_out);
 
Datum date_sec_out(PG_FUNCTION_ARGS)
{
	d_Timepoint_sec *timep_sec = (d_Timepoint_sec *) PG_GETARG_POINTER(0);
	char *result;
	result = (char *) palloc(100);
	snprintf(result, 100, "(%ld,%hu,%hu,%hu,%hu,%lf)", timep_sec->year(), timep_sec->month(), timep_sec->day(), timep_sec->hour(), timep_sec->minute(), timep_sec->second());
	PG_RETURN_CSTRING(result);
}
 
}
Si ce n'est pas dû à l'héritage, qu'est-ce que ça peut-être ??
valda est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h43.


 
 
 
 
Partenaires

Hébergement Web