MySQL ile CDC (Change Data Capture)

Amaç : Tabloda yapılan tüm değişiklikleri satır satır tutmak istiyoruz.

"firmalar" adında bir tablomuz var.

SQL:
  1. CREATE TABLE `firmalar` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `ad` varchar(255) NOT NULL,
  4.   `resim_link` varchar(255) NOT NULL COMMENT 'logo',
  5.   `adres` text NOT NULL,
  6.   `tel1` varchar(30) NOT NULL,
  7.   `tel2` varchar(30) NOT NULL,
  8.   `faks1` varchar(30) NOT NULL,
  9.   `faks2` varchar(30) NOT NULL,
  10.   `web` varchar(255) NOT NULL,
  11.   `vergi_dairesi` varchar(100) NOT NULL,
  12.   `vergino` int(11) NOT NULL,
  13.   `ilgili_kisi` varchar(60) NOT NULL,
  14.   `ilgili_email` varchar(255) NOT NULL,
  15.   `durum` tinyint(4) NOT NULL,
  16.   `iuser` int(11) NOT NULL COMMENT 'insert eder user',
  17.   `idate` datetime NOT NULL COMMENT 'insert tarihi',
  18.   `uuser` int(11) NOT NULL COMMENT 'update eder user',
  19.   `udate` datetime NOT NULL COMMENT 'update tarihi',
  20.   PRIMARY KEY  (`id`)
  21. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Tablodaki ek loglama alanları. Bu alanlar ile o satırın insert ve update bilgilerini tutuyoruz. Yani o firmayı kim girdi, ne zaman girdi, kim güncelledi ne zaman güncelledi bilgilerini tutuyoruz.
iuser : insert eden user id
idate : ilk insert edilme tarihi
uuser : son update eder user id
udate : son update edilme tarihi

Peki değişen veriler/alanlar neler onları tutmak için basit çapta bir CDC yapısı oluşturmamız gerek.

Öncelikle değişimleri tutacak olan tablomuzu açalım.
Tabonun adı : arsiv_firmalar

SQL:
  1. CREATE TABLE `arsiv_firmalar` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `firma_id` int(11) NOT NULL,
  4.   `ad` varchar(255) NOT NULL,
  5.   `resim_link` varchar(255) NOT NULL COMMENT 'logo',
  6.   `adres` text NOT NULL,
  7.   `tel1` varchar(30) NOT NULL,
  8.   `tel2` varchar(30) NOT NULL,
  9.   `faks1` varchar(30) NOT NULL,
  10.   `faks2` varchar(30) NOT NULL,
  11.   `web` varchar(255) NOT NULL,
  12.   `vergi_dairesi` varchar(100) NOT NULL,
  13.   `vergino` int(11) NOT NULL,
  14.   `ilgili_kisi` varchar(60) NOT NULL,
  15.   `ilgili_email` varchar(255) NOT NULL,
  16.   `durum` tinyint(4) NOT NULL,
  17.   `iuser` int(11) NOT NULL COMMENT 'insert eder user',
  18.   `idate` datetime NOT NULL COMMENT 'insert tarihi',
  19.   `uuser` int(11) NOT NULL COMMENT 'update eder user',
  20.   `udate` datetime NOT NULL COMMENT 'update tarihi',
  21.   `zaman` datetime NOT NULL COMMENT 'kayit tarihi',
  22.   PRIMARY KEY  (`id`)
  23. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

id : bu alan arşiv tablosunun kendi id alanı olacak, firma id lerini firma_id alanı tutacak.
zaman : değişikliğin yapıldığı zamanı tutacak.

Yapmak istedğimiz iş;
`firmalar` tablosunda yapılan tüm değişikliklerde ilgili satırı olduğu gibi `arsiv_firmalar` tablosuna yazmak.
Bunun için MySQL de bir TRIGGER oluşturuyoruz.

cdc_firmalar_update : Trigger adı.

SQL:
  1. CREATE TRIGGER cdc_firmalar_update AFTER UPDATE ON firmalar
  2. FOR EACH ROW INSERT
  3.     INTO arsiv_firmalar SET
  4.         firma_id = NEW.id,
  5.         ad = NEW.ad,
  6.         resim_link=NEW.resim_link,
  7.         adres=NEW.adres,   
  8.         tel1=NEW.tel1,
  9.         tel2=NEW.tel2,
  10.         faks1=NEW.faks1,
  11.         faks2=NEW.faks2,
  12.         web=NEW.web,
  13.         vergi_dairesi=NEW.vergi_dairesi,
  14.         vergino = NEW.vergino,
  15.         ilgili_kisi = NEW.ilgili_kisi,
  16.         ilgili_email = NEW.ilgili_email,
  17.         durum = NEW.durum,
  18.         iuser = NEW.iuser,
  19.         idate = NEW.idate,
  20.         uuser = NEW.uuser,
  21.         udate = NEW.udate,
  22.         zaman = NOW();

Bu trigger firmalar tablosuna yapılan her update işlemindne sonra (AFTER UPDATE ON firmalar ) çalışacak ve yeni girilen verileri arsiv_firmalar tablosuna insert edecek.

Diyelim ki firma_id=50 olan kayıt için değişim tutanağını görmek istiyoruz.

SQL:
  1. SELECT * FROM arsiv_firmalar WHERE firma_id=50 ORDER BY zaman ASC;

Bu sorgu bize 50 nolu firma için yapılan tüm değişiklikleri satır satır gösterecek.

Bu yapıyı tüm talolar için kurarsanız veritabanındaki tüm değişiklikleri kayıt etmiş olursunuz.

AB
06.07.2011

Son yılların popüler konusu, yazılım geliştirme metotları (stilleri).

http://tr.wikipedia.org/wiki/Tasar%C4%B1m_%C3%B6r%C3%BCnt%C3%BCleri

Türkçe PHP örnekleri:
http://ysfkc.com/php/signleton-desing-pattern-oop-yazilim-deseni.html
http://ysfkc.com/php/factory-design-pattern.html
http://ysfkc.com/php/adapter-design-pattern.html
http://ysfkc.com/php/php-decorate-design-pattern.html
http://ysfkc.com/php/prototype-pattern.html

* yeni nesil programcılar yeni nesil kod yazma mimari yapılarını çok seviyor :)

Kitaplar:
http://www.amazon.com/php-architects-Guide-Design-Patterns/dp/0973589825/ref=sr_1_1?ie=UTF8&qid=1301913319&sr=8-1

http://www.amazon.com/Professional-Design-Patterns-Wrox-Programmer/dp/0470496703/ref=sr_1_3?ie=UTF8&qid=1301913319&sr=8-3

http://www.amazon.com/PHP-Action-Objects-Design-Agility/dp/1932394753/ref=sr_1_5?ie=UTF8&qid=1301913319&sr=8-5

http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124/ref=sr_1_2?ie=UTF8&qid=1301913296&sr=8-2

http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_1?s=books&ie=UTF8&qid=1301913874&sr=1-1 (vikipedia’da konusu gecen GoF)

Yıldız Teknik Üni. MYO Internet Programciliği Final soruları

yildiz teknik üni , internet programciligi 1 , 1.ogr. final sorulari
http://fileape.com/dl/UYn9JgKpbszovjG3
yada
Internet Programciligi I - Final Sorulari 1.Ogr.pdf

yildiz teknik üni , internet programciligi 1 , 2.ogr. final sorulari
http://fileape.com/dl/UFDTxdBcFx6q0k5F
yada
Internet Programciligi I - Final Sorulari 2.Ogr.pdf

file_exists() dosya var mı yok mu kontrolü yapar.
is_file(), is_dir() true yada false döndürür.
is_readable() true yada false döndürür.
is_writable() true yada false döndürür.
is_executable() true yada false döndürür.
filesize() adını verdiğimiz dosyanın büyüklüğünü byte olarak bildirir.
filedate() dosyanın son erişim tarihini,
filemtime() dosyanın son değişiklik tarihini,
filectime() ise dosyanın oluşturulma tarihini döndürür.
touch() dosyanın oluşturulacağı yer ve dosya ismi bilgileri girilir.
unlink() dosya siler.
mkdir ("deneme", 0777); dizin oluştur.
rmdir ("deneme"); dizin sil.


<?php
/**
 * class turetme ornegi
 * ayhan baris
 */

/**
 * canlilara ait genel ozellikler ve olaylar
 */
class canli {
	public $kutle;

	function nefes_al(){
		echo "nefes al<br>\n";
	}

	function nefes_ver(){
		echo "nefes ver<br>\n";
	}
}

/**
 * insanlara ait genel ozellikler ve olaylar
 */
class insan extends canli {

	public $goz_rengi;
	public $sac_rengi;

	function uyu(){
		echo "uyuyor...<br>\n";
	}

	function calis(){
		echo "calisiyor...<br>\n";
	}
}

/**
 * bebeklere ait genel ozellikler ve olaylar
 *
 */
class bebek extends insan{

	function agliyor_mu(){
		echo "hayir su anda aglamiyor...<br>\n";	
	}

	function yurumeye_basladi_mi(){
		echo "evet<br>\n";
	}
}

/**
 * evcil hayvan genel ozellikler ve olaylar
 */
class evcil_hayvan extends canli{

	public $cinsiyet;
	public $tip; // kara , su

	function acikti_mi() {
		echo "tok...<br>\n";	
	}

	function huysuz_mu(){
		echo "evet...<br>\n";
	}
}

# * # * # * # * # * # * # * # * # * # * # * # * # * # *  

$class_insan = new insan;
$class_insan->nefes_al();
$class_insan->nefes_ver();

echo str_repeat("-",20);
echo "<br>\n";

$class_bebek = new bebek;
$class_bebek->nefes_al();
$class_bebek->nefes_ver();
$class_bebek->uyu();
$class_bebek->yurumeye_basladi_mi();

echo str_repeat("-",20);
echo "<br>\n";

$evcil_class = new evcil_hayvan;
$evcil_class->nefes_al();
$evcil_class->nefes_ver();
$evcil_class->huysuz_mu();
?>

XQuery, XML tipi veriler üzerinde sorgulama yapabilmek için geliştirilmiş bil dildir. Bu dil, Quilt isimli bir sorgulama dilinden türetilmiştir, ve yapı olarak SQL'e benzer. XQuery bir W3C standardıdır.

Xquery 1.0, Xpath 2.0 sürümünün bir uzantısıdır, dolayısıyla Xpath için geçerli olan bütün sorgular Xquery için de geçerlidir.

Örnekler

bakkal.xml

CODE:
  1. <?xml version="1.0" encoding="ISO-8859-9"?>
  2. <belgesel_bakkal>
  3.  <belgesel kategori="HAYVANLAR">
  4.     <ad dil="tr">Yunuslar</ad>
  5.     <fiyat>15.00</fiyat>
  6.   </belgesel>
  7.   <belgesel kategori="HAYVANLAR">
  8.     <ad dil="tr">Gergedanlar</ad>
  9.     <fiyat>17.99</fiyat>
  10.   </belgesel>
  11.   <belgesel kategori="SANAYİ">
  12.     <ad dil="tr">Dökme Demir</ad>
  13.     <fiyat>35.49</fiyat>
  14.   </belgesel>
  15. </belgesel_bakkal>

Aşağıdaki sorgu, bakkaldaki belgesellerden fiyatı 30 YTL'den daha az olanları bulur.

for $x in doc("bakkal.xml")/belgesel_bakkal/belgesel
where $x/fiyat<30
return $x/ad

Sonuç olarak aşağıdaki değerler çıkar;

Yunuslar
Gergedanlar

Aşağıdaki sorgu bakkaldaki belgesellerden sanayi ile ilgili olanları bulur.

doc("bakkal.xml")/belgesel_bakkal/belgesel[@kategori='SANAYİ']

iyi seneler

http://desktop.gittigidiyor.com/turbolist/turbolist-logo.gif

GG TurboList

http://desktop.gittigidiyor.com/turbolist/

Yapmış olduğumuz incelemelerde,

Sitemiz üzerinden “açık artırma” yöntemi ile satışa sunulan ürünlere olan ilginin, özellikle “alıcılar” nezdinde, önemli ölçüde azalmış ve azalmaya devam etmekte olduğunu;

“Açık artırma”yı kazandığı halde ödeme yapmayan alıcılara dair şikayetlerin önemli ölçüde artmış ve artmaya devam etmekte olduğunu gözlemlemiş bulunuyoruz.

Bu nedenlerle, 21 Aralık 2010 tarihinden itibaren, “açık artırma” yöntemi ile site genelinde yeni listeleme yapılmasına son veriyor olacağız.

İyi alışverişler dileriz.

Saygılarımızla,

GittiGidiyor

arkadaşlar merhaba,

- php-tr.com (portal + forum)
- ve facebook da : PHP-TR

bir oluşumumuz var.

gittigidiyor, secretcv, sahibinden... ceşitli firmalarda calişan PHP'ci arkadaşlar ile ilk toplantımızı kadikoyde yaptik.

etkinlikler hakkında bilgilendirilmek için lütfen face'deki grubumuza uye olur.

tşk...