Serendipity: Kesimpulan


By fradze - Posted on 29 May 2009

Salam semua..

nampaknya terpaksalah aku ringkaskan je blog aku ni.. sebab aku agak kesuntukan masa untuk

mengarang panjang2.. sorry banyak, dan juga aku tulis dalam bahasa rojak juga lah ya untuk kali

ni. Yang penting kita dapat kongsikan input yang diberikan.

Banyak juga yang telah aku pelajari dari pertandingan ini sama ada secara langsung atau tidak

langsung. Pada mulanya aku agak task yang diberikan agak mudah. Ya lah convert database sahaja..
Tapi bila aku mula buat agak banyak kerumitan dan dugaan yang aku jumpa satu demi satu.

Walaupun serendipity mempunyai database layer yang tersendiri.. pada awalnya aku rasanya ianya

tidak banyak membantu. Bayangkan terdapat banyak if ($database == mysql) else if else bla bla di

setiap file..
aku terfikir, takkan aku nak portkan mssql aku perlu tambah lagi else if untuk setiap query..
berapa banyak file aku nak edit? dah la malam je ada masa.. :p so aku tanamkan dalam misi aku

"aku cuma ingin buat perubahan seminimum yang mungkin" dalam task ini.

aku pasti korang paham maksud aku. sebabnya sql statement antara mysql dengan mssql tidak sama
terutama nya untuk select statement dan create table..

contoh2 nya, limit(mysql) top(mssql)
mysql(group by) mysql(kena group by semua yg ada pd select)
Mysql ada Full search text seperti (match against function) Mssql pula lain.
Table type yang berbeza seperti auto increment,
Kalau field tu jenis text tak boleh gorup by, kena convert tu kepada lain format.

dan banyak lagi, aku pun dah lupa bila nak ingat balik... nanti ada masa aku cerita lagi..

Jadi step yang pertama aku buat ialah convert secara manual setiap database type mysql kepada

mssql.. kesemuanya ada 22 table secara default. Kemudian barulah aku 'dump'kan sql dia..

Satu demi satu error aku jumpa bila try connect ke database mssql tersebut.

Dibawah adalah antara beberapa error yang aku sempat copy paste.:

Error
Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library

(such as ISQL) or ODBC version 3.7 or earlier.

(ni field type punya error)

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or

LIKE operator.

(error macam ni kelaur bila try group by, sort text field type. Ni aku rasa korang biasa jumpa)

Warning: mssql_query() [function.mssql-query]: message: Cannot update identity column 'id'.

(severity 16)

(ha, error yang ni pelik sedikit, error ini terjadi bila ada sql calling cuba update identity

field. tapi aku lagi pelik dangan kod sql asal ni, kenapa perlu nak update semula primary id

where primary id bla bla.. cth mcm ni.. update table set id='1 bla bla bla where id='1'... kan

pelik tu..tak pernah aku jumpa lagi..)

Server: Msg 8120, Level 16, State 1, Line 1
Column 'e.id' is invalid in the select list because it is not contained in either an aggregate

function or the GROUP BY clause.

(error ni kelaur bila select list ada tertinggal dalam group by list.)

dan yang lain2 tu aku tak sempat copy..

kebanyakkan error yang datang adalah dari sql yang mempunyai "GROUP BY CLAUSE".

Jadi aku terfikir kalau ada function untuk aku split dan susun balik mysql statement tu kepada

mssql statement.. kan lebih baik? jadi aku mula memeningkan kepala dengan meng"google" kesana

sini..
Nah! aku dah jumpa, MySql parser/wrapper dibuat oleh tom schaeffer..

(http://www.phpclasses.org/browse/package/5007.html)
satu class yang agak advance dan menarik..

Tapi, setalah lama aku bermain2 dengan class tu, nampaknya ia tak sesuai.. kerana banyak field

name database serendipity yang bertembung dengan 'reserve keyword' class tersebut..
Alahai, nampak tiada jalan mudah untuk berjaya. Terpaksa la aku buat sendiri function sql parser
agar bersesuaian dengan mysql statement serendipity.

dibawah ada contoh sql parser yang aku buat yang agak dumbo.. Tapi function ni selekeh sangat

lah, agak berserabut. Tidak apa lah, apa yang penting aku nak pastikan dia "UP" dulu..

function parse_sql_select($sql) {
$con = array("SELECT","FROM","WHERE","GROUP BY","ORDER BY","LIMIT");
$fr_format =  array("e.body",
"e.extended",
"c.category_description",
"co.body");
$to_format =  array("CONVERT(varchar(8000),e.body) AS body",
"CONVERT(varchar(8000),e.extended) AS extended",
"CONVERT(varchar(8000),c.category_description) AS category_description",
"CONVERT(varchar(8000),co.body) AS body");

$ii=0;
foreach ($con as $con2) {
if (preg_match("/$con2/", $sql)) {
if ($ii==0) {
$extract[$ii] = spliti ($con2, $sql);
}
else {
$co = $ii-1; $extract[$ii] = spliti ($con2, $extract[$co][1]);
}
if ($stat_con) {
$sqlarray[$stat_con] = array($stat_con => $extract[$ii][0]);

if ($sqlarray[$stat_con]) {
if ($sqlarray[$stat_con] == $sqlarray["SELECT"]) { $array2merge =

$sqlarray["SELECT"]; }
else { $array2merge += $sqlarray[$stat_con]; }
}
}
$stat_con = $con2;
$ii++;
}
}
$sqlarray[$stat_con] = array($stat_con => $extract[$ii-1][1]);
$array2merge = array_merge($array2merge, $sqlarray[$stat_con]);
$sql_array = array_merge($array2merge);

//echo "<pre>";
//print_r($sql_array);
//echo "$sql<br>";

if ($sql_array["LIMIT"]) {

if (preg_match("/,/", $sql_array["LIMIT"])) {

}
else { $top = "TOP" . $sql_array["LIMIT"]; }

}

$select_statement = $sql_array["SELECT"];
if ($sql_array["GROUP BY"]) { $modify_select = str_replace($fr_format, $to_format,

$select_statement); }
else { $modify_select = $select_statement; }

if ($modify_select) { $compile = "SELECT " . $top . $modify_select; }
if ($sql_array["FROM"]) { $compile .= "FROM" . $sql_array["FROM"];  }
if ($sql_array["WHERE"]) { $compile .= "WHERE" . $sql_array["WHERE"];  }
if ($sql_array["GROUP BY"]) {

if (preg_match("/AS/", $sql_array["SELECT"])) {
$as_remove = explode(",", $sql_array["SELECT"]);
$compile .= " GROUP BY ";
$group_unsplit = "";
foreach ($as_remove as $k=>$v) {
if (preg_match("/AS/", $v)) {
$exp = explode("AS", $v);
$group_unsplit .= $exp[0];

}
else { $group_unsplit .=  $v; }
}

$str = preg_replace('/\s+/', ' ',  $group_unsplit);

$group_array = explode(" ", $str);
foreach ($group_array  as $key => $value) {
if (is_null($value) || $value=="" || $value=="''") {
unset($group_array [$key]);
}
}

$fr_format =  array("e.body",
"e.extended",
"c.category_description",
"co.body");
$to_format =  array("CONVERT(varchar(8000),e.body)",
"CONVERT(varchar(8000),e.extended)",
"CONVERT(varchar(8000),c.category_description)",
"CONVERT(varchar(8000),co.body)");

$imp_group = implode(",", $group_array);
$compile .= str_replace($fr_format, $to_format, $imp_group);
}
else {
$imp_group = " GROUP BY" . $modify_select;
$compile .= str_replace($fr_format, $to_format, $imp_group);
}
}
if ($sql_array["ORDER BY"]) { $compile .= " ORDER BY" . $sql_array["ORDER BY"]; }

//echo $sql."<br>$compile";
return $compile;

}

aku harap korang dapat idea apa sebenarnya yang aku nak buat dengan function tersebut..
function tersebut boleh diringkaskan lagi, tapi aku tak mahir pakai regex...
Jadi, terselamat lah aku daripada perlu mengedit semua 300 lebih sql statement serendipity..huh!

function tersebut langkah demi langkah aku modify agar bersesuaian dengan serendipity..
Ada masa aku nak sediakan dengan adodb pula..

Bila mana kebanykkan error telah aku perbaiki.. Aku cuba alihkan fokus kepada installer pula.
Ya..  file yang aku modify disini ialah include/functions_installer.inc.php. Aku tambah satu

condition untuk mssql.. 

Dalam proses aku menyediakan installer, mulanya aku nak pakai db scheme yang asal (sql/db.sql)
aku cuma buat replacement kepada.. contoh replacement array yang di buat kepada db.sql;
static $search  = array(
'{AUTOINCREMENT}',
'{PRIMARY}',
'{UNSIGNED}',
'{FULLTEXT}',
'{FULLTEXT_MYSQL}',
'{BOOLEAN}',
'{UTF_8}',
"default '1'",
'int(1)',
'int(4)',
'int(10)',
'int(11)',
'text not null',
'text NOT NULL',
'text',
"'0'",
"'1'",
"date NOT NULL",
'default null',
'default NULL',
"default ''"
);
static $replace = array(
'INT IDENTITY (1, 1) NOT NULL',
'',
'',
'',
'',
'varchar (300) NOT NULL',
'',
'default 1 NULL',
'int',
'bigint',
'bigint',
'bigint',
'text NOT NULL',
'text NOT NULL',
'text',
"0",
"1",
"datetime NOT NULL",
'NULL',
'NULL',
''
);
$query = trim(str_replace($search, $replace, $query));

Memang berjaya pada mulanya, tapi dalam mssql perlu dinyatakan jika file tersebut default null.

dan aku buat lagi satu db schame untuk mssql.. (include/db_mssql.sql)

Kadang2 ada juga error disebabkan mssql return value true, tetapi sebernarnya null.. jadi aku

trim je value tu..

Ok.. bila aku test di localhost semua dah jalan dengan baik, aku pun start upload di server..

Sini ada problem pada mulanya, sebab masalah file permission. (Terima kasih kepada saudara

nadzree) Dan juga ada error..

Ada error page not found, aku tak pasti apa aku edit, di plesk.. tapi aku delete Index.php dan masukkan index.php. Sebab mulanya aku kena taip http://fradze.dev.lamp2win.com/mssql/index.php baru jalan.. Kalau http://fradze.dev.lamp2win.com/mssql/ tak jalan..

Banyak lagi aku nak share sebenarnya, tapi tangan aku dah penat menaip..  Dan banyak lagi tanggungjawab lain.. :)

So sebagai kesimpulan, boleh dikatakan serendipity boleh berjalan dengan baik di platform IIS dan MSSQL..

File yang diubah: db.inc.php, functions_config.inc.php , serendipity_plugin_comments.php , functions_entries.inc.php, functions_comments.inc.php, functions_installer.inc.php

File baru : db_mssql.sql, mssql.inc.php

Valuable information and excellent design you got here! I would like to thank you for sharing your thoughts and time into the stuff you post!! Thumbs up insanity workout | Revabs

Well can anybody guide what's this written here, as I am unable to understand it, I think its local Asian language. Is there any translator available to read this post? I am looking forward. Beta Alanine Pro Thanks

Sorry dear I am unable to understand this letter, how can I find it in English?? I think its regional language normally used in India. Thanks fixed annuities

Yes you are right my friend its a regional language.I copied and mailed this script to many of my friends.He translated it for me,what a piece of great information, you can have the copy of it in English.just send me mail and i will reply you with the translated page.Thanks for the post
avg free download

I have the translator but its hard to translate the whole script and then send it to you its better that i send you the program it will help you a lot.Its not that hard.Nice information.
Fantasia Barrino

Thank you so much for helping me and sending me the translator.I have enough information to understand this.A friend of mine ask me for the same favour I will pass your program to him aswell.Thanks once again
Presentation Skills

Good info thanks for sharing with us.
Nice information, valuable and excellent, as share good stuff with good ideas and concepts, lots of great information and inspiration, both of which we all need, thanks for all the enthusiasm to offer such helpful information here Astaga.com lifestyle on the net Astaga.com lifestyle on the net dan nowGoogle.com adalah Multiple Search Engine Popular nowGoogle.com adalah Multiple Search Engine Popular

Thanks for sharing. i really appreciate it that you shared with us such a informative post..
adult high school | Must High School

pengundi,team developer serendipity,my lovely niki dan juga kepada yang terlibat secara langsung atau tidak langsung..
Semoga kita mendapat manfaat dari program ini dan juga agar kita dapat memperbaiki kelemahan masing2..
online ged test | online homeschooling | prior learning

hym.. napa jadi mcm tu post aku..

Terima kasih banyak2 diucapkan kepada pihak penganjur,penaja,para perserta,pengundi,team developer serendipity,my lovely niki dan juga kepada yang terlibat secara langsung atau tidak langsung..
Semoga kita mendapat manfaat dari program ini dan juga agar kita dapat memperbaiki kelemahan masing2..
Terima kasih
 

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options