OCI-Lob  sınıfını tanımıştık. bu sınıfın insert ve update  sorguları için kullanılan metodu olan OCI-Lob::save()  metodunu inceliyor olacağız.  Update sorgularımız için şartımıza uyan bir satır  yoksa php OCI_INVALID_HANDLE gibi bir hata fırlatıyor. update işlemlerini bir sonraki yazıda işleyeceğimiz için şimdilik sadece bahsedip geçiyoruz.

OCI-Lob
bool save ( string $data [, int $offset ] )

save metodu LOB alanlara veri yazmak için kullanılır. OCI lob objelerinin indikasyon özelliği olduğundan  opsiyonel olarak  offset değeri de verebiliyoruz . yani istersek veriyi  lobun istediğimiz alanına yazabiliyoruz.

işte örnek insert işlemi.

0
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$conn=oci_connect(); // bağlantı ayarlarınız
 
$sql = "INSERT INTO loblar
          (
            id,
            lobalan
          )
       VALUES
          (
            loblar_seq.NEXTVAL,
            -- Boş bir CLOB oluşturuyoruz
            EMPTY_CLOB()
          )
       RETURNING
          -- Lob locator dönderiyoruz
          lobalan INTO :mylob_loc";
 
$stmt = oci_parse($conn, $sql);
 
// Boş bir OCI-Lob objesi oluşturuyoruz
$myLOB = oci_new_descriptor($conn, OCI_D_LOB);
 
// LOB loactor a bağlıyoruz.
oci_bind_by_name($stmt, ":mylob_loc", $myLOB, -1, OCI_B_CLOB);
 
// Sorguyu çalıştıyoruz (Default Transaction modunda)
oci_execute($stmt, OCI_DEFAULT)
    or die ("Unable to execute query\n");
 
//  Lob alana şimdi istediğimizi yazdırıyoruz
if ( !$myLOB->save('Tarih : '.date('H:i:s',time())) ) {
 
    // Hata olmuşsa geri sarıyoruz
    oci_rollback($conn);
 
} else {
 
    // başarıyla yazabildiysek commit ediyoruz.
    oci_commit($conn);
 
}
 
// kaynakları boşaltıp  veritabanı bağlantısını kesiyoruz.
oci_free_statement($stmt);
$myLOB->free();
oci_close($conn)

Blob Compression konusunda bilgi almak için de şu konuyu okuyabilirsiniz

Oracle Blob Compression

4000 byte’tan daha büyük verilerle çalışıyorsak LOB  alanlara ihtiyacımız olacaktır.   

Standart (basit) veritabanı tipleriyle çalışmak diğer datalarda olduğu gibi Oracle’da da oldukça kolay. Fakat dosya saklama – ya da stringe dönüşümünde veri bozulmaları yaşayabileceğimiz 4000 byte tan büyük datalarla çalışacaksak Oralce LOB (Long Objects) lara ihtiyacımız olacaktır. PHP ile Oracle LOB alanlarda  yapabileceğimiz işlemleri incelemden once kısaca LOB tipleri tanımlayalım  

Oracle LOB Objects     

 

  • BLOB, Binary verileri saklamak için kullanırır (Binary Long Object)
  • CLOB, Veritabanı karakter setinde normal karakterler saklamak için kullanılır (Characters Long Object)
  • NCLOB,Unicode datalar saklamak için kullanılır . PHP nin Oci8 eklentisinde bu yoktur.
  • BFILE, Veritabanı sunucusnda dosya adresini referans alarak sunucuda saklanacak dosyalar için kullanılır.
  •   

    Üzerinde işlem yapılan LOB alanlar biz boşaltana kadar geçici tablo alanında (Temporary Tablespace) saklanır .  Oracle 9i ve öncesinde bu tipler için table spacede ayrı ayrı saklama yeri oluşturuluyormuş bu yuzden eski sürümlerde bu tipler üzerinde işlem yaparken daha dikkatli olmamız söyleniyor.   

     LOB Saklama 
    Oracle 10g  her LOB hücresi için 128 TB kadar veri saklama kapasitesine sahipmiş. Bu Veri tabanı block boyutu ve yığınlama ayarlarında isteğe bağlı değiştirilebiliniyormuş.  LOB verilerinin saklanması 2 elemanla olur. LOB Content  ve LOB Locator. LOB Content   sadece LOB Locator’un adresini içerir. 
          Dahili LOB tipleri (BFILE dışında kalanlar) 4KB nin altında  olduğu sürece diğer tablo verileriyle aynı (stored in line in the table ) yerde saklanır.   lob alanlarınız 4 kb den küçükse isteklerinizin işlenip size gelmesi gayet hızlı olacaktır. fakat büyükse bu  tablo için yapılan SELECT sorgularında LOB sütunlarının dahil edilmesi sorgu sonucu almanızı yavaşlatacaktır.  

    LOB Kısıtlamaları  
     Lob alalar için en önemli kısıtlamalar. Sorgu dahilinde sıralama ve gruplama işlemleridir.  

    • Coğul Elemelerde  kullanılmaz
    • Sıralamalarda kullanılamaz
    • Gruplamalarda kullanulamaz
    • Birleştirmelede kullanılamaz
    • Primary Key olarak atanamaz
    • Unique index oluşturulamaz

    SELECT DISTINCT <lob_type>
    ORDER BY <lob_type>
    GROUP BY <lob_col>   

    dahil edemeyeceğimiz bu işlemler ile yine bu işlemleri kullanan  UNION -MINUS -INTERSECTION gibi tablo birleştirme işlemlerinide kısıtlamış olur.  

    PHP ve ORACLE LOB işlemleri (OCI-Lob Sınıfı):
       Bu sınıfla ilgili php manual de  maalesef cok sınıflı bilgi var.  php ile OCI LOB işlemleri yapmamız için kullanabileceğimiz bu sınıf dikkatimi çektiği üzere bir cok PHP IDE tarafından da complatorlara dahil edilmemiş.! 

    Yerel Sunucumda PHP 5.3 versiyonunda OCI-Lob sınıfının metodlarını incelemek istedim.
      

    OCI-Lob::load()          
    OCI-Lob::tell()          
    OCI-Lob::truncate()      
    OCI-Lob::erase()         
    OCI-Lob::flush()         
    OCI-Lob::setbuffering()  
    OCI-Lob::getbuffering()  
    OCI-Lob::rewind()        
    OCI-Lob::read()          
    OCI-Lob::eof()           
    OCI-Lob::seek()          
    OCI-Lob::write()         
    OCI-Lob::append()        
    OCI-Lob::size()          
    OCI-Lob::writetofile()   
    OCI-Lob::export()        
    OCI-Lob::import()        
    OCI-Lob::writetemporary()
    OCI-Lob::close()         
    OCI-Lob::save()          
    OCI-Lob::savefile()      
    OCI-Lob::free()           

    metodların hepsini maalesef işleyemeyeceğim fakat kullandıkça örnekleri de buraya yazmaya çalışacağım. 

    IEnumerator Arayüzü:


     

     System.Collections isimalanı içinde bulunan bu arayüz Iteator işlemleri yapmamızı sağıyor. Bunu kendimiz de yapamaz mıyız ? tabi ki yaparız. Ama  belli başlı sınıflar ya da kullanımlar bizden IEnumarator ya da IEnumarable arayüzüne sahip sınıflardan türetilmiş elemanlar ister bu yüzden iterator işlemlerimiz için kendi yapımızı kullanmak yerine IEnumarator ve IEnumarable arayuzlerini implment edersek genel geçer bir yapımız olur.

    Bu yapıyı şunlara benzetebiliriz.
    Foreach
    PHP’de db result fetching olayları.
    .Netciler de zaten .GetEnumartor() metorlarını çokça kullanmışlardır. 

    Neden MovePrev yok derseniz onu da  makaleyi okuduktan sonra eklersiniz.  sınıflarımıza (:. 

    IEnumerable Arayüzü:



    Tek metod (GetEnumarator) isteyen bu arayüz bir iterator olmanız yerine sizden iterator gorebi gorebilecek bir dongu de alabilir. Bu da cok işimize yarayabilecek ozelliklerden biridir. Hemen bir IEnumarator dönderebilen Sınıf implement ediip geçmeden önce yield return’dan bahsederlim 

    Yield Return:



    IEnumarator dönüş tipi olan bir fonksiyon (Örn: GetEnumarator()) birden fazla elemanın ard arda dönebileceğini düşünün. Ki zaten .nett te Enumarator yapısı bunun üzerine kurulmuştur. IEnumarator yapısıyla dönecek elemanın tipi de belirlenebiliniyor. Bu da bizi Current elamanının type casting olayından kurtarıyor. IEnumarator dönüş tipinizse yield return ile birden fazla eleman döndürüp bunu da GetEnumarator() dye tanımlayabilirsiiz bunları yapmışken IEnumarable arayüzünden implement ederseniz yine bazı standartlara uymuş olursunuz. 

    Şimdi hem IEnumarable türüne örnek yazalım hem de yield return kullanımına örnek göstereelim.

    Örnek sınıfımız artık bize bir numarator verebiliyor. 

    Ve bu kullanıma artık müsait. Tabi ki kullanımız bu kadar basit olmayacaktır ancak örnek olması açısından düşünülebilir. Bu verilerin bize belli bir kaynaktan geldiğini varsayalım yine hiç bir şey değişmeyecek ve kaynağımızdan alma sırasına göre numratatore gonderebileceğiz. Örnek sınıfımızı hiç bozmadan buna örnek vermek istersek. 

    Yield return anında bir kırılma olabilir mi ? return olsaydı olurdu anca debug anında şoyle bir şey gözlemledim. Numarator alan fonksiyon ya metodlar beraberinde üretim fonksiyonununda ismini taşıyor “GetEnumaratıor” tahminimce kaldığı yeri de burdan biliyor 

    IEnumarator<T> Arayüzü:



    Kendi tiplerimize iterate ozelliği kazandırabilir miyiz. .NET in En sevdiğimiz yapılarından olan Generic Collections bize bura da Numaratorleri object türünden değil de kendi tiplerimizde kullanma şansı veriyor. LINQ içinde from eleman in elemanlar dediğimizde eleman tipini tanıması generic collectionslarda tipin zaten tanımlanıyor olmasıdır. Biz de numaratorlerimizde YazilimciNumarator.Current deiğimizde cast ihtiyacı duymadan . tipine uygun metodları ya da propertyleri kullanabilmemiz için Enumarator arayüzüne de sahip bu arayüzü kullanmalıyız bir yazılımcı sınıfı yazıp numaratore ornek verelim.

    IEnumarable<T> Arayüzü:



    IEnumarable Arayüzü ile aynı olan bu arayüz GetEnumarator metodunu ezerek buna bir de tip tanınlanmış olan IEnumarator tipinde bir Generic dönderir. Yine bu metodu biz yazacağız.
    Yazılımcı listesini yine bir “yield return” örneğiyle kısaca anlatalım.
    Artık tipimiz de belliyse şimdi numarator gibi kullanırken”Current” bize “Yazilimci” gibi davranabilecek davranmaktan ziyade tipi zaten Yazilimci olacaktır fakat bunu cast etme ihtiyacı duymadan kullanabileceğiz.

    Makaleyi  pdf formatta isterseniz

    IEnumarable ve IEnumarator.pdf

    iyi çalışmalar..

    Sunucuma kurduğum squid serverda msn kullanamadığımı farkedince  izinleri araştırmaya başladım. ilk once   msn protokolunu araştırıp izin vermeyi denedim ama herşeye izin vermem gerekiyordu nerdeyse msn için

    http :  HEAD,CONNECT,CONTINUE gibi http metodlarına geçiş izni vermek gerekiyor bunlarla beraber şifre doğrulaması yaptığı urllere de izin vermek gerekiyor.

    acl msnmessenger url_regex -i gateway.dll
    acl MSN req_mime_type ^application/x-msn-messenger$
    acl MSN req_mime_type ^application/x-msnmsgrp2p$
    acl MSN req_mime_type ^application/x-msnmsgr-sessionreqbody$
    acl MSN req_mime_type ^application/x-msnmsgr-transreqbody$

    bu başlıklar  eklendikten sonra msn sorunsuz çalışıyor. ama şoyle bir ihtimal var bu başlıklara izin verirken ek bir doğrulama da koymazsanız  herkese izin vermiş olursunuz.

    http_access allow MSN sizinSartiniz

    sizinSartiniz yerine sizi tanımlayan kuralı da eklerseniz sadece sizin içn msn izni vermiş olursunuz. orn :IP

    © 2012 Tufan Suffusion theme by Sayontan Sinha