Re: [Linux-programlama] A Fark B (SQL)

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Çağatay Tengiz (cagatay@tengiz.net)
Date: Tue 25 Jan 2005 - 10:30:48 EET


Bence daha farklı tasarım ve tek tablo ile Firebird'de bu iş çözülebilir.

Tablo yapısı

create domainler (
domain_adi varchar(50) --bir domain en fazla kac karakter olabilir?
,domain_uzanti varchar(20)
,ck_aktif smallint
,tarih_aktivasyon date --listeye girdiÄŸi tarih
,tarih_deaktivasyon date --listeden düştüğü tarih
,tmp_kontrol smallint
,constraint pk_domainler primary key (domain_adi, domain_uzanti))

Bu tablo C yerine server'da doldurulmalıdır. Bunun için bir sql
cümleciği, bir stored prosedüre ile sonlandırıcı bir sql cümleciği yeterli

İlk önce tüm kayıtların deaktive olduğunu varsayalım :

update domainler set ck_aktif = 0;

Stored prosedür tabloya kayıtları ekleyeceğiz, son sql cümleciği ile de
kayıtların son durumunu belirleyeceğiz.

create procedure domain_ekle (
   domain_adi varchar(50)
, domain_uzanti varchar(20)
)
as
begin

/*
Öncelikle kaydı tabloya insert etmeyi deneyelim. Eğer primary key hatası
verirse, bu kayıt tabloda zaten var demektir o zaman aktif durumunu 1
yapalım

Eğer pk hatası vermezse yoktur demektir, o zaman kayıt eklenir
zaten.

Firebird'de hata kontrolü begin-end blokları içinde olmalı
*/

   begin
     insert into domainler
       (domain_adi, domain_uzanti, ck_aktif, aktivasyon_tarih)
     values
       (:domain_adi, :domain_uzanti, 1, current_date);
     when sqlcode -803 do --Burada primary key hatasını yakalıyoruz.
        update domainler set ck_aktif = 1;
          where domain_adi = :domain_adi
                and domain_uzanti = :domain_uzanti;
        /* burada ÅŸu kontrol de yapılabir :
        select tarih_deaktivasyon from domainler
           where domain_adi = :domain_adi
                 and domain_uzanti = :domain_uzanti
           into :tmp_tarih;
        if (:tmp_tarih is not null) then
          update domainler set
            ck_aktif = 1
            , tarih_deaktivasyon = null
            , tarih_aktivasyon = current_date
          where domain_adi = :domain_adi
                and domain_uzanti = :domain_uzanti;
        else
          update domainler set
            ck_aktif = 1
          where domain_adi = :domain_adi
                and domain_uzanti = :domain_uzanti;
        */
   end
end

Şimdi program içersinde bir for-next döngüsü ile text dosyadan okunan
değerler ile bu prosedür çağrılır. Döngü bittikten sonra tabloda olmayan
kayıtların ck_aktif değeri 0 olacaktır bu durumda son sql cümleciğimiz
şu olacaktır :

update domainler set tarih_deaktivasyon = current_date where ck_aktif = 0

Ben olsam böyle çözerdim ama hız konusunda bir test yapamadım. Ama
sonuçta daha hızlı bir çözüm olabilir diye düşünüyorum. Çünkü Firebird
için 300-400 MB veri çerez.. :)

Selamlar, iyi çalışmalar.

Çağatay Tengiz

Guray SATICI wrote:
> On Tue, 25 Jan 2005 08:47:31 +0200, Serdar KÖYLÜ
> <serdarkoylu@fisek.com.tr> wrote:
>
>>Biraz da konu dağıldı gibi. En başından, bana şu kaynaktan şu veriler
>>geliyor, bu verileri şöyle veritabanına alıyorum vs. gibi sürecin
>>tamamını anlatabilirseniz, size daha faydalı olabiliriz sanıyorum..
>
>
> Konuyu bastan anlatiyorum hocam.
> Mevcut olan bir FTP hesabi sayesinde com.zone.tgz, net.zone.tgz ve
> digerlerinin bulundugu dosyalari sistemime aliyorum. Bu dosyalar dunya
> uzerinde mevcut olan tum domain lerin listesini iceriyor.
> Sonra bu dosyalari acip
>
> cat dosya_ismi | grep NS | cut -d " " -f 1 > son_hali
> sort -u son_hali > en_son_hali
>
> komutlari ile suzuyorum.
> en_son_hali dosyasinin icerigi bildigimiz domain ler olarak kaliyor.
> Her satirda domain ler mevcut. Bu suzme islemi ile 2.5 GB boyutunda
> olan com.zone dosyam 400 MB boyutuna dusuyor. Ayni sekilde 1 GB kusur
> olan net.zone dosyam ise 70 MB a iniyor. Buraya kadar hatali bir sey
> olmadigini saniyorum.
>
> Bundan sonra C ile bu dosyalari satir satir okuyup veritabanina
> atiyorum. Su an Mysql e kayit yapabiliyorum. Ayni zamanda C++ bir
> uygulama ile de Firebird a conn. olup gerekli veri aktarimini
> yapabiliyorum.
>
> Bu FTP den cektigim tgz dosyalari gunluk olarak yenileniyor ve ben gun
> icerisinde tekrar bu dosyalari cekip ayni surecten gecirmeyi
> planliyorum.
> Bu sayede 12 saat (atiyorum) once mevcut olan kayit ile su an cektigim
> ve yenilenmis kayitlar arasindaki farklari bulmak istiyorum.
>
> 12 saat once var olan bir kayit, su an cektigim yeni veriler arasinda
> mevcut degilse bu domain kapatilma surecini girmistir diyorum. Benim
> icin bu domain ler onemli (A/B kumesi elemanlari). Tabiki yeni gelen
> veriler arasinda yeni domain ler mevcut olacaktir. Ama bu benim isimi
> gormeyecek (B/A kumesi elemanlari). Ayni zamanda 12 saat once de
> mevcut olup simdi de mevcut olan domain ler olacaktir. (Bu da A
> kesisim B kumesi elemanlari)
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Linux-programlama mailing list
> Linux-programlama@liste.linux.org.tr
> http://liste.linux.org.tr/mailman/listinfo/linux-programlama

_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.