Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
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 20/03/2011, 01h35   #1
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 8
Points : 8
Par défaut [OCILIB] OCI_ConnectionFree avant OCI_StatementFree

Bonsoir,

En phase de tests sur mes devs, je suis tombé sur un hang lorsqu'un OCI_ConnectionFree est réalisé avant OCI_StatementFree (Le statement étant lié à la connection).

Je tiens à préciser que je pense que le fait de fermer la connection avant de libérer le statement est bien entendu hors de toute logique mais...

Fly.

Ce test a été réalisé sur la version 3.4.0.
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
 
 
	OCI_Connection *cn;
	OCI_Statement  *st;
	OCI_Resultset *rs;
 
	IF (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT))
		RETURN EXIT_FAILURE;
 
	cn = OCI_ConnectionCreate("XX", "X", "X", OCI_SESSION_DEFAULT);
	st = OCI_StatementCreate(cn);
 
	OCI_Prepare(st, "select 'toto' from dual");
	OCI_Execute(st);
 
	rs = OCI_GetResultset(st);
 
	while (OCI_FetchNext(rs))
	{
		printf("La tête à %s\n",OCI_GetString(rs,1));
	}
	OCI_ConnectionFree(cn);
	OCI_StatementFree(st);
 
	OCI_Cleanup();
cobfly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 23h08   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Quand OCI_ConnectionFree() est appelé, tous les objets OCI_Statement crées pour la connexion en question sont libérés..

OCI_StatementFree(), dans ce cas va vouloir accéder à un pointeur invalide...

C'est comme faire deux appels d'affilé à free()... comportement indéterminé !

Ou est ton problème ?
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h07   #3
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 8
Points : 8
Bonjour,

Il ne s'agit pas vraiment d'un problème . Je développe une série d'apis fournies à des programmeurs. Une des apis permet de se connecter, certaines permettent de gérer les statements sur une connection.

Le souci est que je ne vais pas forcément être derrière leurs épaules pour vérifier qu'ils codent comme il le faut.

Je pensais que la fonction OCI_StatementFree allait renvoyer une erreur du type 'invalide handle' ou autre.

Fly.
cobfly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h41   #4
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Citation:
Envoyé par cobfly Voir le message
Bonjour,

Je pensais que la fonction OCI_StatementFree allait renvoyer une erreur du type 'invalide handle' ou autre.

Fly.
Si NULL est passé à OCI_StatementFree(), une erreur est renvoyée.

Mais si la valeur n'est pas nulle, comment faire ? Tester la validité d'un pointeur qui pointe sur une zonée mémoire déja libérée, de maniére portable et sans overhead, est quasi impossible...
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 11h11   #5
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 8
Points : 8
Bonjour,

Bien compris, il me reste à ajouter un petit booléen de ma liste de statement

Merci.
Fly
cobfly 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 20h11.


 
 
 
 
Partenaires

Hébergement Web