Passer au contenu principal

Votre serviteur a eu le malheur de travailler en C avec Sybase. En fait le vrai problème de ce SGBD est sa diffusion franchement confidentielle, ce qui fait qu’il est compliqué d’obtenir de l’aide sur des sujets assez communs en particulier avec le C. Voici donc quelques astuces pour économiser vos cheveux.

Compiler du Sybase en environnement 64 bits

Sur la plupart des systèmes, si vous ne vous méfiez pas, votre programme utilisant Sybase compilera en 64 bits mais ne saura pas pour autant utiliser la base de données. Les messages d’erreur, comme souvent avec Sybase, sont dans ce cas particulièrement abscons. La solution est pourtant simple, il faut ajouter le flag suivant pour la compilation :

-DSYB_LP64

Les librairies réentrantes de Sybase

Sybase propose des librairies dites réentrantes qui servent dans des cas très précis de systèmes distribués. On reconnaît ces librairies car elles ont le suffixe _r. Par exemple libsybintl.so, la librairie normale, devient libsybintl_r64.so. La règle est que globalement, vous ne devriez jamais avoir à utiliser ces librairies sauf cas très précis. Si vous les utilisez, vous courez droit au segfault !

Commandes de Sybase prenant un paramètre de version

Le problème suivant ne se produira que lors de la vie d’un produit dans la durée, avec migration d’une version à une autre de Sybase. Bref pour initialiser une connexion on passe par la fonction ct_init, qui prend en paramètre un pointeur et la version de Sybase. Vérifiez toujours que la version de Sybase passée en paramètre correspond à la version serveur de Sybase à laquelle vous vous connectez. Par exemple si vous vous connectez à du Sybase 16 depuis un client Sybase 16 vous devriez avoir :

ct_init(*cntx_ptr, CS_VERSION_160);

A noter que la même remarque s’applique à toutes les commandes prenant un indicateur de version de Sybase en paramètre. Il n’y en a pas tant que ça rassurez-vous.

Taille des pointeurs de données avec blk_bind

La fonction blk_bind permet de lier des champs à des pointeurs notamment pour faire des lectures et écritures en masse. Le problème est que cette fonction est très chatouilleuse sur les tailles des types de données. Ainsi si par exemple vous passez un programme Sybase de Linux 32 bits à Linux 64 bits qui utilise des int, blk_bind cessera de fonctionner car les int de Linux 32 bits sont sur 4 octets alors que ceux de Linux 64 bits sont sur 8 octets. Par conséquent veillez toujours à utiliser des types de données dont la taille est fixe quelle que soit l’environnement, ici int32_t.

Si maintenant vous utilisez des casts pour passer un type vers un autre, par exemple d’un long vers un int, veillez toujours à tout d’abord initialiser la valeur long à zéro, de façon à éviter des effets de bord avec le blk_bind. Dans mon cas j’avais un int qui était casté en char et j’ai passé une journée à déboguer le truc…


Cet article vous a plu ? Vous aimerez sûrement aussi :

Julien
Moi c’est Julien, ingénieur en informatique avec quelques années d’expérience. Je suis tombé dans la marmite étant petit, mon père avait acheté un Apple – avant même ma naissance (oui ça date !). Et maintenant je me passionne essentiellement pour tout ce qui est du monde Java et du système, les OS open source en particulier.

Au quotidien, je suis devops, bref je fais du dév, je discute avec les opérationnels, et je fais du conseil auprès des clients.

Son Twitter Son LinkedIn

Laisser un commentaire