Vous n'êtes pas identifié(e).
Bonjour
Je sais utiliser lo_import et lo_export depuis PgAdmin pour gérer mes images : tout est ok.
Je sais utiliser un serveur PostgreSQL depuis un projet cocoa via xcode, ok sauf en ce qui concerne les oid.
Impossible de stocker des images dans la BdD avec lo_import, ni d'extraire des images avec lo_export dans mon projet Xcode.
Je suppose qu'il y a un problème d'autorisation ? Mais je ne trouve rien, ni sur le net, ni dans les doc.
Pourtant PgAdmin est une application OS X comme les applications produites avec Xcode, non ?
Quelqu'un aurait-il une clé pour me permettre de débloquer la situation ?
Merci.
Dernière modification par mybofy (07/06/2013 10:54:01)
Hors ligne
Sans plus d'informations, non, aucune clé magique
Pouvez-vous donner plus de détails sur ce que vous faites et sur le problème que vous rencontrez ?
Guillaume.
Hors ligne
OSX 10.7.5 - Xcode 5.6.1 - PostgreSQL 9.1
Je crée une application osx avec xcode.
J'utilise le framework pgsqlkit pour accéder à un serveur postgresql local.
Aucun problème pour me connecter à une BdD, accéder à une table et exécuter des requêtes sql pour manipuler la table comme je veux. Comme je le fais avec pgAdmin.
Sauf pour utiliser les fonctions lo_import et lo_export.
NB: connection est OK
Table images:
...
CREATE TABLE images ( image oid ) WITH ( OIDS=TRUE );
...
Dans mon projet xcode :
NSString *sql0 = @"select image from images where oid=19805;";
PGSQLRecordset *rs0 = [connection open:sql0];
NSLog(@"rs0 : %@", rs0);
marche très bien :
2013-06-02 14:31:03.923 Image[23354:603] rs0 : <PGSQLRecordset: 0x103b080b0>
Alors que :
NSString * sql1 = @"insert into images values (lo_import('/pg-imgs/titi.jpg'));";
PGSQLRecordset *rs1 = [connection open:sql1];
NSLog(@"rs1 : %@", rs1);
ne marche pas :
2013-06-02 14:31:03.923 Image[23354:603] rs1 : (null)
Pour contrôle, les requêtes sql0 et sql1 marchent bien dans pgAdmin.
Merci
Hors ligne
Quel est le message d'erreur au niveau du serveur ? ou au niveau du framework ?
Guillaume.
Hors ligne
Sans connaître ce framework pour OSX, ça ne parait pas anormal qu'il n'y ait pas de recordset en retour d'un INSERT qui ne retourne pas de résultat.
Que se passe-t-il s'il y a une clause RETURNING à cet INSERT pour récupérer un résultat, du style:
insert into images values (lo_import('/pg-imgs/titi.jpg')) returning image
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
to #4
Le log donne :
2013-06-02 19:29:17 CEST ERROR: must be superuser to use server-side lo_import()
12 2013-06-02 19:29:17 CEST HINT: Anyone can use the client-side lo_import() provided by libpq.
13 2013-06-02 19:29:17 CEST STATEMENT: insert into images values (lo_import('/pg-imgs/titi.jpg'))
comment executer le lo_import comme superuser ?
Hors ligne
pour #5
Cela ne change rien.
C'est plutôt un problème de superuser, cf #6 ?
Merci
Hors ligne
Oui il faut être superuser comme dit le message d'erreur.
Puisque ça passe avec pgAdmin, ça passera dans l'application en utilisant le même compte.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Par contre, ça veut dire que le fichier a importé se trouve sur le même serveur que le serveur PostgreSQL.
Guillaume.
Hors ligne
pour #8
Dans les paramètres de connexion du framework PGSQLKit:
- j'avais pour valeur de la variable "userName" le rôle de connexion de la BdD,
- j'ai remplacé cette valeur par le superuser,
- et lo_import et lo_export marchent !
Visiblement, je n'avais pas compris les rôles dans PostgreSQL, notamment celui du superuser qui peut tout faire pour PostgreSQL, comme le fait le compte root pour les unix.
pour #9
Oui, mais ça c'est assez facile à faire, pour moi du moins...
Grand merci à tous.
Hors ligne
Ça marche, mais pas toujours...
Connexion sous superuser
Ce qui marche :
select lo_export(images.image, '/Users/rn/pg-imgs/toto.jpg') from images where oid=19799;
ll /Users/rn/pg-imgs/
total 5488
drwxrwxrwx 4 rn staff 136 4 jui 17:46 ./
drwxr-xr-x+ 71 rn staff 2414 4 jui 17:25 ../
...
-rw-rw-rw- 1 rn staff 1402800 4 jui 17:46 toto.jpg
...
Ce qui ne marche pas :
select lo_export(images.image, '/Users/rn/Library/Developer/Xcode/DerivedData/Image-clbsvkdcitfkxjalymeymfwizgpz/Build/Products/Debug/Image.app/Contents/Resources/toto.jpg') from images where oid=19799;
ll /Users/rn/Library/Developer/Xcode/DerivedData/Image-clbsvkdcitfkxjalymeymfwizgpz/Build/Products/Debug/Image.app/Contents/Resources
total 14256
drwxrwxrwx 17 rn staff 578 4 jui 17:32 ./
drwxrwxrwx 6 rn rn 204 28 mai 16:15 ../
...
-rw-rw-rw- 1 rn staff 1402800 30 mai 18:45 toto.jpg
...
Cela ne marche pas non plus :
select lo_export(images.image, '/Users/rn/pg-imgs/toto.jpg') from images where oid=19799;
ll /Users/rn/pg-imgs/
total 5488
drwxrwxrwx 4 rn staff 136 4 jui 17:46 ./
drwxr-xr-x+ 71 rn staff 2414 4 jui 17:25 ../
...
-rw-r--r-- 1 rn staff 1402800 4 jui 17:46 toto.jpg
...
Étrange, non ?
Hors ligne
Quel est le message d'erreur ?
Guillaume.
Hors ligne
Le user avec lequel vous lancez le projet est "rn"? Car il semblerait que ça soit un problème de permissions.
Un simple "sudo chown -R username /Users/username/Library/Developer/Xcode" ne résoudrait pas le problème?
Dernière modification par Bidou (05/06/2013 09:35:40)
Hors ligne
Je crois que je commence à comprendre...
Il y a deux problèmes, qui interféraient.
1. Rôle de connexion.
Pour utiliser "lo_import" et "lo_export" il faut se connecter à la BdD avec le rôle "superuser",
cf. http://docs.postgresql.fr/9.1/lo-funcs.html
Je n'avais pas compris que j'utilisais "lo_import" et "lo_export" en mode "server-side".
2. Permissions.
Les fichiers créés ou lus via "lo_import" et "lo_export" le sont avec le "user" d'installation
de PostgreSQL, par défaut "postgres" que j'ai gardé.
Il faut donc que les permissions du répertoire où sont ces fichiers soient "drwxrwxrwx".
Xcode place ses fichiers dans "/Users/rn/Library/Developer/...".
Or, "Library" a pour permissions "drwx------", d'où "Permission denied" de "lo_import" et "lo_export".
J'ai fait l'essai de modifier les permissions de "Library" en "drwxrwxrwx" : sans surprise tout marche.
Mais cette modification me paraît très risquée : je suis revenu aux permissions d'origine de "Library".
Je tente de contourner la situation !
Bien à vous tous
Hors ligne