From: Volkan YAZICI (yazicivo@ttnet.net.tr)
Date: Mon 13 Jun 2005 - 09:26:40 EEST
Merhaba,
On Fri, Jun 10, 2005 at 08:37:37PM +0300, Ahmet ERDOGAN wrote:
> C++ kullanarak lo_import ile veritabanıma gönderdiğim bir resim dosyasını
> lo_export ile almaya çalışıyorum ancak dosyayı sunucu'nun data klasörüne
> export ediyor.
LO fonksiyonları sunucu[1] ve istemci[2] taraflı olmak üzere ikiye
ayrılırlar. Siz buradan anladığım kadarı ile (çünkü gerçekleştirmek
istediğiniz LO işlemi sunucu tarafında meydana geliyor) sunucu taraflı
LO fonksiyonlarını kullanıyorsunuz, halbuki istediğiniz şey istemci
taraflı LO fonksiyonları.
[1] www.postgresql.org/docs/7.8/interactive/lo-funcs.html
[2] www.postgresql.org/docs/7.8/interactive/lo-interfaces.html
İkisi hakkında çok yüzeysel de olsa bahsetmeye çalışayım.
Sunucu taraflı LO fonksiyonları:
SQL sorgusu şeklinde karşı tarafa iletilir ve üzerinde işlem yapacağı
dosyalar sunucu üzerinde bulunur. Şöyle ki:
PQexec(conn, "SELECT lo_import('/tmp/example.tar')");
satırı C/C++ programınızda, sunucuya ilgili SELECT sorgusunu iletip,
size oluşacak LO kaydının OID değerini döndürecektir. Yalnız burada
dikkat etmeniz gereken en önemli şey /tmp/example.tar dosyasının
sunucu üzerinde yer alıyor olmasıdır. (Bir de şunu unutmamak gerekir
ki, sunucu taraflı LO fonksiyonlarını kullanabilmek için,
veritabanı superuser'ı (sistem superuser'ı ile karıştırmayalım)
olmanız gerekir.)
İstemci taraflı LO fonksiyonlar:
Kütüphane tarafından sağlanan C/C++ fonksiyonları ile karşı tarafa
iletilir ve üzerinde işlem yapacağı dosyalar istemci üzerinde bulunur.
Şöyle ki:
lo_import(conn, '/home/kernel/current.img');
satırı C/C++ programınızda, libpq (yada libpqxx) kütüphanesi
tarafından sağlanan lo_import() fonksiyonunu kullanarak, istemci
üzerindeki /home/kernel/current.img dosyasının sunucu üzerinde
kaydedilmesini sağlar. Fonksiyon sonuç olarak (başarılı olması
durumunda) oluşan LO kaydının LOID değerini ya da (hatalı olması
durumunda) InvalidOid değerini döndürecektir.
> bu dosyayı istemci makinaya nasıl aldırabilirim ?
İstemci taraflı LO fonksiyonlarını kullanarak.
> biraz araştırma yaptım ve lo_oid diye bir fonksiyonla karşılaştım
> bunu ilk kez duyuyorum aydınlatırsanız sevinirim
LO kayıtları veritabanın yapısının dışında, apayrı bir tabloda
barındırılırlar: pg_largeobject. Bu tablonun iç yapısı ise şu
şekildedir:
=> \d pg_largeobject
Table "pg_catalog.pg_largeobject"
Column | Type | Modifiers
--------+---------+-----------
loid | oid | not null
pageno | integer | not null
data | bytea |
Indexes:
"pg_largeobject_loid_pn_index" UNIQUE, btree (loid, pageno)
Sanırım bir LO için OID'in ne anlama geldiğini (loid sütununa bakarak)
şimdi daha iyi anlamaşsınızdır.
LO fonksiyonların hakkında daha ayrıntılı bilgi için PostgreSQL'in kendi
dökümantasyonundan yararlanabilirsiniz.
İyi çalışamalar.
_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama