Vous n'êtes pas identifié(e).

#376 Re : Général » Insertion multiple et update » 12/04/2012 16:27:31

Quelle est la version de postgresql utilisée?

#377 Re : C et C++ » Compiler libpqxx sous Windows 7 avec MSVC11 » 12/04/2012 16:09:51

Pour snprintf effectivement c'est du C99 non supporté par Visual. En faisant simple on peut avoir #define snprintf _snprintf même si le vrai fix est un peu plus compliqué.
Voir http://stackoverflow.com/questions/2915 … tudio-2010


Pour l'allocation dynamique de tableau, à mon avis la meillleure solution est d'utiliser alloca() qui est dispo à la fois en glibc (gnu) et en Visual C++. Il faut simplement si je me rappelle bien éviter de lever une exception C++ avant la fin de la fonction appelante.


Pour la création de base en mode non connecté, c'est impossible avec postgresql, la solution la plus simple consiste à se connecter à la base template1 (pré-créée automatiquement par initdb) pour exécuter le CREATE DATABASE.

#378 Re : C et C++ » Compiler libpqxx sous Windows 7 avec MSVC11 » 11/04/2012 23:31:08

Beta c'est subjectif. Ici c'est parce qu'il n'y a pas eu vraiment de stress-test sur ce code.
Sinon, pas de nouvelles fonctionnalités prévues à court terme. Ca m'intéresserait beaucoup d'intégrer libpqtypes, mais je n'ai pas assez de temps pour le faire.

#379 Re : C et C++ » Compiler libpqxx sous Windows 7 avec MSVC11 » 10/04/2012 17:04:59

Noxalus a écrit :

Sinon, t'as surcouche semble être intéressante, mais j'ai l'impression que tout comme libpqxx, tu ne proposes rien en ce qui concerne sa compilation sur des systèmes Windows

J'ai sous le coude un mail avec un patch d'un utilisateur pour VS2010 qu'il faudrait que j'intègre.
Je crois qu'il y a juste une allocation dynamique de tableau dans la pile (=extension gcc) qui nécessite un remplacement de code, le reste étant surtout du préprocesseur. Rien de bien méchant.
Pour ce qui est de la compilation à part, la manière la plus simple de l'exploiter est de copier le .h et .cpp dans son propre projet sans même chercher à en faire une lib, ça va tout à fait avec le côté basique et léger de la surcouche.

#380 Re : C et C++ » Compiler libpqxx sous Windows 7 avec MSVC11 » 10/04/2012 16:28:41

Est-ce que tu peux m'en dire plus sur les choix de conception de libpqxx que tu n'as pas aimé ? (mis à part le défaut cité plus haut)

Ok, voici quelques éléments de réponse:

Un inconvénient concret est qu'on ne peut pas exécuter des commandes sql sans instancier d'abord une transaction, alors que postgresql lui-même ne l'impose pas (non seulement il ne l'impose pas mais dans de rares comme CREATE DATABASE, il l'interdit. A ce jour il me semble  qu'il n'y a tjrs pas de moyen de faire un create database avec  libpqxx).
En plus le design pattern suggéré  des functors pour les transactions me parait trop loin de la logique classique d'encapsulation, et sert surtout à "résoudre" un pb (la perte de connexion), qui à mon avis est hors sujet.


La lib ne gère pas du tout le format binaire. L'intérêt du binaire est discutable pour le tout venant, mais pour les champs bytea de taille significative, c'est dommage.


D'une manière générale, le niveau d'abstraction de l'API me parait trop élevé là où ça ne m'intéresse pas vraiment et pas assez là où ça m'intéresserait.
Trop: parce que quand on connait déjà les idiomes postgresql et qu'on sait à quoi on veut arriver au niveau SQL, on se retrouve à décortiquer l'API de haut en bas pour trouver derrière quelle classe c'est caché et à quel niveau de la hiérarchie il faut opérer. Parfois c'est dur à comprendre: pour les prepared statements par exemple, la méthode pour typer les paramètres m'a paru incompréhensible, et aucun exemple ni dans la doc ni dans le tutoriel.


En revanche, peu d'abstraction pour les manipulations de données échangées entre client et serveur et la gestion de type. On utilise esc(), to_string(), from_string() pour encoder/décoder, et là on se croirait presque en C. Cette partie-là me parait décevante parce qu'on peut faire mieux en C++. Rien non plus pour gérer les tableaux ou les types composites ni en entrée ni en sortie.

#381 Re : C et C++ » Compiler libpqxx sous Windows 7 avec MSVC11 » 06/04/2012 21:03:36

Noxalus a écrit :

En principe, on peut tout aussi bien utiliser la puissance de libpq avec libpqxx puisqu'il s'agit, pour moi, d'une simple surcouche permettant l'utilisation de la syntaxe propre au C++. libpq est donc nécessaire pour que libpqxx puisse fonctionner et donc si jamais des fonctionnalités offertes par libpq ne sont pas exploité avec libpqxx, on peut toujours utiliser la lib de base !

A condition de le faire dans une connexion à part, ce qui en limite beaucoup l'intérêt, Car il y a une étanchéité explicite entre libpqxx et libpq.
Extrait de la FAQ: http://pqxx.org/development/libpqxx/wiki/FaqFeatures

For my program I need to access some C-level libpq structure that libpqxx hides from me. Can you add a member function that lets me do this?

Generally, no. If you require support for specific high-level functionality, the better solution is usually to build it into the abstraction layer rather than to break the abstraction layer open like this.

Also, the isolation that the abstraction layer provides allows libpqxx to do things like automatic connection recovery. Such things can be impossible if the library does not have full and unique control over the underlying C-level structures, or in other cases they might lead to subtle and complex bugs in your program.

Personnellement, ayant besoin de C++ et peu emballé par l'API de libpqxx et certains de ses choix de conception, j'ai choisi il y a longtemps de faire ma propre surcouche ( http://manitou-mail.org/pgstream/overview.html ) qui permet de mélanger C et C++ , mais surtout avec une API plutôt du style d'OTL pour oracle ( http://otl.sourceforge.net ) dont l'élégance m'avait  impressionné.

Et aujourd'hui pour PG il y a aussi libpqtypes en C ( http://libpqtypes.esilo.com/ ) qui est à considérer  pour se simplifier le code.

#382 Re : Général » resultat incorrect d'une requete select » 23/03/2012 21:46:57

senafeda a écrit :

si vous voulez je peux vous envoyer ma table.
Merci d'avance

C'est une bonne idée.
Sinon côté résolution peut-être tenter un REINDEX, un index corrompu pouvant mener à des incohérences entre différentes requêtes.

#383 Re : Installation » Installation des versions 8.4 et 9.0 - PB creation compte sur 9.0 » 12/03/2012 17:45:37

OLF a écrit :

- Existe-t-il un fichier de conf. gérant les users des bases?

Dans Debian spécifiquement oui, il y a le fichier /usr/share/postgresql-common/user_clusters.
Faire man user_clusters pour plus d'infos. (man pg_wrapper aussi est utile pour voir comment debian gère plusieurs instances simultanées).

#384 Re : C et C++ » Afficher résultat fonction avec libpq » 14/02/2012 22:10:48

mourad a écrit :

J'ai utilisé la librairie libpq, mais je n'arrive pas à afficher les résultats vu que lorsque je récupère les enregistrements renvoyés dans un CURSOR et puis j'essai de faire le parcours de ce curseur j'ai toujours le nom de la procédure qui est affiché avec comme valeur "unnamed portal".
Est ce que quelqu'un a une idée où se trouve mon problème et qu'est ce que je dois faire pour corriger ce problème ?
Merci d'avance pour votre aide.
Cordialement.

La représentation textuelle d'un refcursor, c'est son nom. Il se trouve que les noms générés par PG ressemblent à <unnamed portal N> mais ça n'a pas d'importance. Le programme C++ doit récupérer ce nom comme résultat de la fonction et le mettre dans la commande FETCH ALL FROM "mettre le nom ici".
Le programme C++ lui-même n'a pas à utiliser DECLARE name CURSOR FOR... car sinon ça fait double emploi avec le curseur déjà ouvert dans la fonction plgsql.

#385 Re : PSQL » clé étrangère impossible ? » 04/02/2012 20:03:25

Ce n'est pas la bonne syntaxe pour FOREIGN KEY.
Il faudrait plutôt ça:

CREATE TABLE tablemd (md text,sid INTEGER, keyid integer REFERENCES table_principal (keyid));

#386 Re : Général » COPY From : format delimiteur » 03/02/2012 19:48:04

Le code 173 n'est pas le point d'exclamation, c'est un "soft hyphen".
Voir http://en.wikipedia.org/wiki/Latin1
Le point d'exclamation inversé serait plutôt 161

Et pour le passer à COPY pourquoi ne pas commençer par le plus simple: ... DELIMITER '¡' ?

#387 Re : Général » Vue, régle et clé primaire » 02/02/2012 14:32:58

msxsan a écrit :

ok, mais cette technique ne peut elle pas poser de problèmes en cas d'accès multiples sur la première table ?

Lorsque 2 requêtes SQL sont lancées à la suite au sein d'une règle, leur exécution est-elle exclusive ? Supposons qu'une première requête sur la vue déclenche le INSERT, le code SQL (INSERT dans la la table A et INSERT (avec curval(seq_table_A)) dans la table B est lancé. Si durant ce laps de temps, une nouvelle requête INSERT est fait sur la table A, le résultat de curval(sql_table_A) ne risque t'il pas d'être erroné ? Faut il utiliser une transaction (BEGIN et COMMIT) autour des deux requêtes pour préserver leur contexte ?

Non l'exécution n'est pas exclusive mais ça ne change rien au résultat de currval('sequence') puisque c'est la valeur pour la session en cours.

#388 Re : Optimisation » Lenteur d'execution d'une requete avec la version 8.4 » 01/02/2012 17:46:46

Le Martret a écrit :

Nous avons observé un temps de réponse de 1 à 10 pour une requête simple (select * from data limit 2000000) qui retourne 200000 enregistrements entre  deux versions de postgresql  8.3 et 8.4 avec la même base de données.

1 - ancien serveur
postgresql 8.3  :   Ubuntu 8.04 LTS server, : temps de réponse <2s

2 - nouveau serveur   plus puissant !!!!
postgresql 8.4  :   Ubuntu 10.04 LTS server :  temps de réponse >20s

Idem sur station deux autres stations de travail  avec Ubuntu 10.04 et postgresql 8.4

y-a-t-il une optimisation particulière pour régler ce problème ?
Est-ce un problème d'optimisation ?

Une explication possible est que par défaut les packages debian/ubuntu de postgres ont une connexion cryptée avec SSL y compris sur localhost.
Dans le cas d'un gros select * sur un réseau très rapide, a fortiori localhost, ça peut effectivement mettre 10 fois plus de temps en crypté qu'en clair pour transférer tous les résultats.
Et le temps en question ne se voit pas dans l'explain analyze.
En revanche en socket du domaine unix il n'y a jamais de cryptage, c'est précisé dans la doc de libpq.

#389 Re : Général » prendre en compte un time zone spécifique » 27/01/2012 18:56:51

Jean-Marie a écrit :

dans le cas où je remplace CET par UTC+1, j'obtiens pourtant le résultat attendu soit :

26/01/2012 14:39:15 | 13.485  | 52.276

C'est à mon avis un problème d'interprétation de ce que désigne réellement UTC+1.
Voir ce passage de la doc de postgresql:
http://www.postgresql.org/docs/9.1/stat … etime.html

Another issue to keep in mind is that in POSIX time zone names, positive offsets are used for locations west of Greenwich. Everywhere else, PostgreSQL follows the ISO-8601 convention that positive timezone offsets are east of Greenwich.

Donc UTC+1 dans ce contexte bien précis ne désignerait pas l'heure d'hiver à Paris, mais un fuseau de l'autre côté du méridien de Greenwich, pas du tout équivalent à CET.

vous avez dit qu'il faut que le temps de départ ait un time zone

comment puis-je préciser cette information

Si je comprends la situation de départ, la colonne date serait du type timestamp without time zone, et la timezone de la session postgres serait UTC.
Il faut voir que:
1) AT TIME ZONE 'zone' appliqué à un timestamp without time zone produit un timestamp with time zone.
2) tout timestamp with time zone est présenté à l'utilisateur en étant converti au vol dans le fuseau horaire de la session.

Donc, SELECT date AT TIME ZONE 'CET' va certes convertir la valeur de date dans le fuseau CET mais le reconvertir aussitôt  dans le fuseau UTC avant présentation à l'utilisateur.

Si je ne trompe pas dans le raisonnement, le résultat recherché s'obtiendrait plutôt par:
select ((date at time zone 'UTC') at time zone 'CET')
Peut-être aussi que 'Europe/Paris' serait un meilleur choix que CET pour être valide toute l'année.

#390 Re : Général » RENAME COLUMN et renommage des composantes d'un index » 21/01/2012 16:39:53

La commande \d matable de psql, ainsi que pg_dump -s permettent de voir du point de vue de l'utilisateur sur quoi porte l'index.
En regardant là, on voit que le renommage d'une colonne est bien propagé à l'index.

La question de savoir pourquoi pg_attribute.attname n'est pas renommé pour l'index a une réponse ici:
http://archives.postgresql.org/pgsql-ha … g01398.php

Mais plus généralement il faut éviter de supposer quoi que ce soit sur les tables de pg_catalog, c'est quand même essentiellement de la tambouille interne du SGBD susceptible de changer d'une version majeure à l'autre.

#391 Re : Général » mettre valeur colonne dans le nommage d'un fichier.txt » 19/01/2012 20:22:21

delirium a écrit :

ET j'ai ce nouveau message d'erreur :

ERREUR:  la colonne « num_id » n'existe pas
LINE 1: ...* FROM rapport_curatif WHERE numero = num_id LIM...

C'est normal car à l'intérieur de la chaine de caractères 'COPY....num_id....' , l'interpréteur plpgsql ne fait pas d'interpolation (=recherche de variable et remplacement par leur valeur).

Le code doit le faire lui-même en faisant par exemple une construction par concaténation de ce genre-là:

ordre_sql :='COPY (SELECT * FROM nom_table WHERE numero =' ||  num_id || ' LIMIT 1)... '

#392 Re : Général » Update En meme temps qu'un select » 11/01/2012 14:24:15

Pourquoi passer par la base pour retrier une liste qui est déjà chargée dans une appli? Les composants d'affichage du genre grille ou liste ont généralement leurs propres méthodes de tri en mémoire par une colonne, visible ou non.
Par ailleurs sil y a 2 utilisateurs simultanés et qu'ils doivent voir un tri différent, l'avoir dans une colonne de la table ne peut pas convenir.

#393 Re : Général » problème d'ident sur l'user postgres » 10/01/2012 13:35:48

Si la méthode ident ne convient pas, adapter le fichier pg_hba.conf ou bien forcer une autre méthode avec:
psql -q -U postgres -h localhost -f monfichier.sql
et saisir le mot de passe
ou si impossible de saisir le mot de passe, utiliser un fichier .pgpass ou la variable PGPASSWORD

#394 Re : Général » Prb d'insertion sur une table avec un SERIAL PRIMARY KEY » 07/01/2012 19:28:55

Cette séquence lgputils_numuser_seq est automatiquement créée pour la colonne SERIAL, mais sa gestion ultérieure est laissée à la charge de l'utilisateur.
Donc en parallèle au grant insert on LGPUTILS to public, il faudrait donner le droit d'utilisation à la séquence utilisée pour le  SERIAL.
avec une commande du type: GRANT USAGE on lgputils_numuser_seq to public;

Sur le fait de préciser le numuser:

INSERT INTO LGPUSERNEW VALUES (1,'userA','PASS');
ERREUR:  droit refusé pour la séquence lgputils_numuser_seq
même en précisant le numuser, pas moyen que ça marche

Il est normal que ça ne change rien, puisque la règle en place court-circuite justement ce qui est passé dans numuser ainsi que pour l'autre colonne, seul le mot de passe atterrit dans la table.

#395 Re : Général » Prb d'insertion sur une table avec un SERIAL PRIMARY KEY » 07/01/2012 17:12:21

par contre ma règle usernew_insert2 refuse de fonctionner. pourtant la règle a bien été crée sans erreur.
ex : INSERT INTO LGPUSERNEW (password) VALUES ('pass');
>> ERREUR:  une valeur NULL viole la contrainte NOT NULL de la colonne « nom »

Le premier problème est qu'il y a 2 règles AS ON INSERT TO LGPUSERNEW DO INSTEAD
et il n'en faudrait qu'une seule.
En l'état vraisemblablement PG exécute la 1ere règle d'abord et s'arrête net sur nom à NULL sans même exécuter la 2eme règle.

Le deuxième problème est que l'INSERT de la seconde règle est de toute façon invalide. Il faudrait plutôt qu'il ressemble à

INSERT INTO LGPUTILS VALUES
    (default,
     current_user,
    NEW.PASSWORD);

La syntaxe colonne=valeur, c'est pour les UPDATEs.

Sinon sur le principe, utiliser des règles pour faire ça est excessivement compliqué à mettre au point et sans intérêt réel par rapport à une simple fonction procédurale.

#396 Re : Migration » Garder INTEGER comme type boolean » 22/12/2011 17:50:16

ofthestreet a écrit :

:'( bouh bouh, va falloir modifier du code pour se connecter à postgresql malgré une compatibilité avec h2/sybase/oracle/sqlserver

Le code cité en exemple ne passe pas sous oracle non plus:

SQL> create table Tutu (isNull_ INTEGER);

Table created.

SQL> insert into Tutu  Values(false);
insert into Tutu  Values(false)
                         *
ERROR at line 1:
ORA-00984: column not allowed here

Autant pour la compatibilité inter-SGBD, le principe d'utiliser des entiers au lieu des booléens se tient tout à fait, autant une fois qu'on a fait ce choix, que vient faire le mot clef false dans une requête? C'est lui qui n'est pas supporté par tous les SGBDs, et  plus généralement le concept de valeur booléenne en SQL (select 1=1 from dual ne fonctionne pas non plus)

#397 Re : PL/pgSQL » Trigger lors de la mise à jour d'une colonne en particulier » 30/11/2011 13:27:44

Il me semble que ce trigger ne retourne pas NEW quand colonneA n'a pas changé et n'est pas NULL, dans ce cas il ne retourne rien.
C'est une erreur, il faut obligatoirement retourner NEW.

Accessoirement, pour ce genre de test le plus simple est d'utiliser IF new.colonneA  IS DISTINCT FROM  old.colonneA THEN... END IF, qui fonctionne comme attendu y compris quand il y a des valeurs nulles.

#398 Re : Installation » Problème de connexion distante Postgresql 9.1.1 version Windows » 30/11/2011 00:02:57

Fakon a écrit :

Je suis tout à vous pour des renseignements supplémentaires.

Le message d'erreur serait bien utile.

#399 Re : Général » Recuperation de lignes non bloquées sur une table » 29/10/2011 14:14:56

Sinon le même  problème est évoqué sur stackoverflow:
http://stackoverflow.com/questions/3895 … postgresql
avec plusieurs pistes différentes proposées.
Aucune n'utilise pg_locks, ce qui à mon avis confirme ce qui est dit ici, mais certaines utilisent  SELECT FOR UPDATE NOWAIT avec récupération de l'erreur "lock_not_available", intéressant pour se passer du flag+update supplémentaire évoqués plus haut.

#400 Re : Général » Recuperation de lignes non bloquées sur une table » 26/10/2011 14:07:39

La stratégie par introspection des locks est très délicate. De mémoire les lignes verrouillées ne sont pas dans pg_locks mais sur les pages disque de la table elle-même, l'intérêt étant qu'on peut verrouiller énormément de lignes sans consommer de mémoire ou d'espace disque ailleurs.

Une stratégie plus sûre serait plutôt d'implémenter la condition "ligne pas bloquée" avec une colonne dédiée à ça dans la table, le traitement s'appropriant la ligne avec un UPDATE conditionnel. Eventuellement cette colonne peut être un ID unique de traitement qui fait référence à une table des traitements pour un contrôle fin.

Pied de page des forums

Propulsé par FluxBB