Baru saja saya install dan coba2 aplikasi SQuirreL SQL Client, sebuah aplikasi freeware yang dapat didownload dari sourceforge.net
Aplikasi ini dibangun menggunakan Java, sehingga dapat dijalankan di berbagai OS yang telah memiliki JavaVM. Proses instalasi cukup sederhana dan mudah dilakukan.
Tampilan awal aplikasi masih menggunakan theme metal default dari Java. Aplikasi ini langsung mengenali beberapa driver JDBC yang terinstall, tidak seperti DBVisualizer (pembahasan mengenai DBVisualizer menyusul)
Ketika hendak membuat koneksi ke MySQL di localhost, saya cukup kerepotan mencari tombol untuk melakukannya. Di aplikasi ini, task untuk melakukan koneksi disebut dengan istilah Alias. Untuk membuat koneksi ke MySQL, pengguna harus menuliskan string koneksi dalam format JDBC (jdbc:mysql://localhost/). Hal ini dirasa cukup menyulitkan bagi pemula, apalagi yang belum pernah menggunakan JDBC, walaupun aplikasi telah menyediakan template di isian URLnya (jdbc:mysql://<hostname>[,<failoverhost>][<:3306>]/<dbname>[?<param1>=<value1>][&<param2>=<value2>])
Setelah koneksi terjalin, hal yang cukup merepotkan lainnya adalah ketika ingin melihat informasi tabel di sebuah database. Jika di-klik dari panel tree di kiri jendela utama, tidak tampil apapun di bagian kanannya. Ternyata harus dipilih Catalog yang hendak ditampilkan dari dropdown di bagian atas tree. Dropdown ini berisi list schema. Setelah schema dipilih, barulah tampil list tabel pada tree struktur di bagian kanan. Kenapa ga diintegrasikan aja ke dalam tree-nya, biar ga 2 kali kerja kan??
Eksplorasi aplikasi ini baru sampai pada bagian ini. Info tabel yang tampil di bagian kanan cukup lengkap, dibagi dalam tab2. Yang belum ketemu hingga saat ini adalah cara menambah data ke dalam tabel, maupun untuk mengubah struktur tabel. Aplikasi ini memiliki potensi untuk berkembang lebih baik lagi, semoga saja bisa menggantikan peran Navicat (lihat tulisan sebelumnya).
Selasa, April 17, 2007
Review SQuirreL SQL Client
Selasa, April 10, 2007
Weird GNU C++
While programming in C++, I need to transform a string into lower case. I search how to do it, and found a STL algorithm transform:
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
using namespace std;
int main() {
//create a string
string s("Some STRING with MiXed cASE");
cout << "original: " << s << endl;
//lowercase all characters
transform (s.begin(), s.end(), //source
s.begin(), //destination
tolower); //operation
cout << "lowered: " << s << endl;
//uppercase all characters
transform (s.begin(), s.end(), //source
s.begin(), //destination
toupper); //operation
cout << "uppered: " << s << endl;
}
However, when I compile it, I got this error message:
error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*,>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*,>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*,>, std::allocator<char> > >, <unresolved>)'
After googling for it, I've found a tricky solution here. Just made a new function:
char to_lower (const char c) { return tolower(c); }
Then change the transform function calling into:
//lowercase all characters
transform (s.begin(), s.end(), //source
s.begin(), //destination
to_lower); //operation
cout << "lowered: " << s << endl;
It's now compiled with error free, and running as expected. Weird isn't it??
Update : I've found another link explaining this phenomena here.
Rewriting the transform calling into this works too.
//lowercase all characters
transform (s.begin(), s.end(), //source
s.begin(), //destination
(int(*)(int))std::tolower); //operation
cout << "lowered: " << s << endl;
Powerful non free Programming Tools
Here the list of a powerful but, unfortunately, non free programming tools. I hope I could find a free-version replacement tools for these.
- Power Designer.
To design a complex database, with many relation between entities, this tools is a must. Power Designer could make a CDM, and convert it into PDM, or you could reverse engineering existing database schema into PDM and CDM. - Navicat
Browsing database scheme, make new databases, grant privileges, build query from many joined tables. These functionalities are the Navicat's killer feature that I couldn't find in another MySQL tools (yet). - Macromedia Dreamweaver MX 2004 + PHAkt
Web programming with PHP+MySQL+ADOdb will be easier with this deadly combo. But I'm not prefer using Dreamweaver now,cause it mess with the code identation. I prefer using Notepad++ to edit all of my code, it's a powerful text editor. Dreamweaver is good to test a color, cause you could choose the color from color wheel or color diagram.
Kamis, April 05, 2007
OCCI Programming
Untuk mengakses database Oracle dari program yang dibuat dengan bahasa C++, Oracle telah menyediakan interface yang disebut OCCI. Pedoman pemrograman OCCI tersedia di website Oracle dan dapat didownload secara gratis di link ini.
Berikut ini sharing pengalaman saya menggunakan OCCI ini di pekerjaan yang sedang saya kerjakan.
Pola umum program:
Environment *env = Environment::createEnvironment(Environment::OBJECT);
try {
Connection *con = env->createConnection(userName, password, connectString);
Statement *stmt = con->createStatement(query);
ResultSet *rs = stmt->executeQuery();
...
stmt->closeResultSet(rs);
con->terminateStatement(stmt);
env->terminateConnection(con);
}
catch (SQLException &e) {
cerr << "ERROR" << endl;
cerr << e.getErrorCode() << endl;
cerr << e.getMessage() << endl;
}
Potongan kode diatas merupakan pola umum untuk melakukan query ke database Oracle. userName
, password
, connectString
merupakan variabel bertipe string yang isinya disesuaikan dengan informasi akses pengguna ke database yang hendak diakses. query
merupakan variabel string yang berisi query yang hendak dijalankan terhadap database yang sedang diakses.
Untuk mempermudah penggunaan, saya membuat class sendiri untuk membungkus pemanggilan fungsi2 OCCI. Pola class yang saya gunakan :
class myocciclass
{
private:
Environment *env;
Connection *conn;
Statement *stmt;
//properties lain
...
//copy konstruktor
myocciclass(const myocciclass&);
//assignment
myocciclass& operator= (const myocciclass&);
public:
//konstruktor
inline myocciclass(const string& user, const string& passwd, const string& db);
//destruktor
inline ~myocciclass();
//method lain
...
};
//konstruktor
inline myocciclass::myocciclass(const string& user, const string& passwd, const string& db) {
this->env = Environment::createEnvironment (Environment::DEFAULT);
this->conn = env->createConnection (user, passwd, db);
this->stmt = conn->createStatement();
}
//destruktor
inline myocciclass::~myocciclass() {
this->conn->terminateStatement (this->stmt);
this->env->terminateConnection (this->conn);
Environment::terminateEnvironment (this->env);
}
Class diatas dapat ditambahkan dengan properties dan method lain yang dibutuhkan. Dengan menggunakan class seperti ini, pengaksesan database akan lebih mudah, karena di program utama, cukup melakukan instantiasi object dari class myocciclass
:
myocciclass *moc = new myocciclass (userName, password, db);
Selanjutnya tinggal memanggil mothod2 pada object moc
yang telah didefinisikan. Program utama tidak perlu melakukan inisialisasi maupun menutup koneksi ke database Oracle, karena hal itu telah ditangani oleh class myocciclass
.
Selamat memprogram menggunakan OCCI...
Selasa, April 03, 2007
Use your Brain
Think twice before u light and take your smoke dose ;)
Quit Smoking - More amazing video clips are a click away
Minggu, April 01, 2007
Database access from PHP
When building application that need coonections to databases, there are two common options. First, to use a programming language's build in feature to access the database. Second, using a wrapper class / library to provide an easy way to connect to the database.
In PHP, a build in feature to connect to databases is available. Take a look at PHP connection to MySQL. In PHP 5, there are two way to connect to MySQL, either using mysql_ command set, or using mysqli_ command set. Both of those command are incompatible. Example, to escape a string, mysql command set had the command and parameter like this format:
string mysql_real_escape_string ( string unescaped_string [, resource link_identifier] );
But, mysqli had the parameter position swapped:
string mysqli_real_escape_string ( mysqli link, string escapestr )
See, you can't savely replace each
mysql_
with mysqli_
, both command is not compatible. To connect to other database?? Every database build in command had it's own parameter sets, and it's non compatible with the other's command.The second way to access database was created to overcome those issues. One of the library that has multiple database connection support is ADODB. When using ADODB, the command to execute query in the MySQL and in the MSSQL is the same command. The parameter are in the same order. ADODB's version to above escape_string functions is
$conn->qstr(string);
ADODB wil take care resource identifier passing to actual command. ADODB wraps all needed variables into a single object. ADODB make PHP Programming easier.