Difference between revisions of "Lazarus Database Tutorial/ja"
(14 intermediate revisions by 4 users not shown) | |||
Line 12: | Line 12: | ||
=== MySQLをLinuxやWindowsで動作させる === | === MySQLをLinuxやWindowsで動作させる === | ||
− | MySQL User | + | MySQL User Manualの指示に従って進めてください。インストール後、mysqldデーモンが動作していることを確認してください。また、セキュリティを保ちうる範囲で、すべての必要なホスト('localhost',ホスト名,ネットワーク上の他のホスト名)から、すべての必要なユーザー(ルート、mysql、あなた自身、他に必要なユーザーを含む)に、必要な権限が与えられているか、確認してください。 |
− | + | ルートを含むすべてのユーザがパスワードを持っているのが、望ましいです。 マニュアルにある例でデータベース・システムの機能をテストしてください。そして、本当にすべてのユーザが信頼できるアクセスができるかチェックしてください。 | |
− | |||
− | |||
− | |||
− | |||
− | ルートを含むすべてのユーザがパスワードを持っているのが、望ましいです。 | ||
− | |||
(訳注:データベースに接続できない場合、プログラムのプロパティの設定が悪い場合もありますが、そもそも、プログラムの前に、インストール、PCの設定、ユーザー、それぞれの権限の設定がきちんとできているか、データベースのサンプルなどであらかじめ確認しておくことが必要です。) | (訳注:データベースに接続できない場合、プログラムのプロパティの設定が悪い場合もありますが、そもそも、プログラムの前に、インストール、PCの設定、ユーザー、それぞれの権限の設定がきちんとできているか、データベースのサンプルなどであらかじめ確認しておくことが必要です。) | ||
Line 31: | Line 25: | ||
テストスクリプトを実行する前に、testdbというデータベースを生成する必要があります。 | テストスクリプトを実行する前に、testdbというデータベースを生成する必要があります。 | ||
これをおこなうには、MySQL monitorにrootとして、全権限をもってログインして、次のステートメントを発行します。 | これをおこなうには、MySQL monitorにrootとして、全権限をもってログインして、次のステートメントを発行します。 | ||
− | + | <syntaxhighlight lang=sql> | |
CREATE DATABASE testdb; | CREATE DATABASE testdb; | ||
− | + | </syntaxhighlight> | |
それから、すべて関連しているユーザが適切なアクセス権を持っていることを確認してください。 | それから、すべて関連しているユーザが適切なアクセス権を持っていることを確認してください。 | ||
− | + | <syntaxhighlight lang=sql> | |
GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; | GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; | ||
− | + | </syntaxhighlight> | |
ここに、いま実行すべきであるmkdbと呼ばれるスクリプトがあります。 | ここに、いま実行すべきであるmkdbと呼ばれるスクリプトがあります。 | ||
Line 51: | Line 45: | ||
幸運にも、あなたは何とかテストデータベースを作成したに違いありません。MySQL monitorにログインしている間、 MySQLステートメントを発行して、テストしてください。 | 幸運にも、あなたは何とかテストデータベースを作成したに違いありません。MySQL monitorにログインしている間、 MySQLステートメントを発行して、テストしてください。 | ||
− | + | <syntaxhighlight lang=sql> | |
select * from FPdev; | select * from FPdev; | ||
− | + | </syntaxhighlight> | |
そうすると、FPC開発者のID,ユーザー名、電子メールアドレスが表記されているテーブルを見ることができるでしょう。 | そうすると、FPC開発者のID,ユーザー名、電子メールアドレスが表記されているテーブルを見ることができるでしょう。 | ||
Line 71: | Line 65: | ||
私はtrydb.ppのusesを次のように変更しました。 | 私はtrydb.ppのusesを次のように変更しました。 | ||
+ | <syntaxhighlight lang=pascal> | ||
uses mysql_v4 | uses mysql_v4 | ||
+ | </syntaxhighlight> | ||
そして、mysql_v4.ppのusesも次のように変更しました。 | そして、mysql_v4.ppのusesも次のように変更しました。 | ||
+ | <syntaxhighlight lang=pascal> | ||
uses mysql_com_v4 | uses mysql_com_v4 | ||
− | + | </syntaxhighlight> | |
/etc/fpc.cfgに、自分のライブラリを指すように次の行を加えました。 | /etc/fpc.cfgに、自分のライブラリを指すように次の行を加えました。 | ||
-Fl/lib;/usr/lib | -Fl/lib;/usr/lib | ||
Line 96: | Line 93: | ||
私はtrydb.ppをユーザーの詳細を含むように修正しました。最初にhost,user,passwordを定数としてもつように。 | 私はtrydb.ppをユーザーの詳細を含むように修正しました。最初にhost,user,passwordを定数としてもつように。 | ||
− | + | <syntaxhighlight lang=pascal> | |
const | const | ||
host : Pchar= 'localhost'; | host : Pchar= 'localhost'; | ||
user : Pchar= 'myusername'; | user : Pchar= 'myusername'; | ||
passwd: Pchar = 'mypassword'; | passwd: Pchar = 'mypassword'; | ||
− | + | </syntaxhighlight> | |
それでも私は、mysql_connect()をコールしても、まだmysqlに接続できないでいました。しかし、より多くのパラメータを必要とするmysql_real_connect()を使うべきだったのです。さらに物事を複雑にしていたのは、多くのパラメータがversion3(パラメータは7個)とversion4(パラメータは8個)の間で変わっているように思えました。 | それでも私は、mysql_connect()をコールしても、まだmysqlに接続できないでいました。しかし、より多くのパラメータを必要とするmysql_real_connect()を使うべきだったのです。さらに物事を複雑にしていたのは、多くのパラメータがversion3(パラメータは7個)とversion4(パラメータは8個)の間で変わっているように思えました。 | ||
Line 108: | Line 105: | ||
ここまでで、接続するためのコードは次のようになりました。 | ここまでで、接続するためのコードは次のようになりました。 | ||
− | + | <syntaxhighlight lang=pascal> | |
− | { | + | { いくつかの追加の変数 } |
var | var | ||
alloc : PMYSQL; | alloc : PMYSQL; | ||
− | { | + | {メインプログラム断片} |
begin | begin | ||
Line 149: | Line 146: | ||
halt (1); | halt (1); | ||
end; | end; | ||
− | {... | + | { ... testdb.ppの本来のコードとして } |
− | + | </syntaxhighlight> | |
それでは、tyrdb.ppのコンパイルを開始する準備はいいですか? | それでは、tyrdb.ppのコンパイルを開始する準備はいいですか? | ||
fpc trydb | fpc trydb | ||
Line 202: | Line 199: | ||
文字列はMemoに下記のような関数をつかって表示されます。 | 文字列はMemoに下記のような関数をつかって表示されます。 | ||
− | + | <syntaxhighlight lang=pascal> | |
procedure ShowString (S : string); | procedure ShowString (S : string); | ||
(* display a string in a Memo box *) | (* display a string in a Memo box *) | ||
Line 208: | Line 205: | ||
trymysqlForm1.ResultsMemo.Lines.Add (S) | trymysqlForm1.ResultsMemo.Lines.Add (S) | ||
end; | end; | ||
− | + | </syntaxhighlight> | |
Connectボタンのイベントハンドラは次のようにします。 | Connectボタンのイベントハンドラは次のようにします。 | ||
− | + | <syntaxhighlight lang=pascal> | |
procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject); | procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject); | ||
(* Connect to MySQL using user data from Text entry boxes on Main Form *) | (* Connect to MySQL using user data from Text entry boxes on Main Form *) | ||
Line 252: | Line 249: | ||
end; | end; | ||
end; | end; | ||
− | + | </syntaxhighlight> | |
右のテキストボックスはSQL文を入力するものです。終了のセミコロンなしで良いです。 | 右のテキストボックスはSQL文を入力するものです。終了のセミコロンなしで良いです。 | ||
きちんとしたSQL文を入力して、SendQueryボタンを押すとクエリが実行され、ResultMemoの中に結果が表示されます。 | きちんとしたSQL文を入力して、SendQueryボタンを押すとクエリが実行され、ResultMemoの中に結果が表示されます。 | ||
Line 262: | Line 259: | ||
アプリケーションは最終的に、Exitボタンがクリックされたときに、MySQLをクローズして終了します。 | アプリケーションは最終的に、Exitボタンがクリックされたときに、MySQLをクローズして終了します。 | ||
SendQueryは次のようになっています。 | SendQueryは次のようになっています。 | ||
− | + | <syntaxhighlight lang=pascal> | |
procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject); | procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject); | ||
var | var | ||
Line 300: | Line 297: | ||
end; | end; | ||
end; | end; | ||
− | + | </syntaxhighlight> | |
プロジェクトを保存して、メニューからRun -> Runを選んでください。 | プロジェクトを保存して、メニューからRun -> Runを選んでください。 | ||
Line 339: | Line 336: | ||
To change contents in the database, I called the DB Engine direct with the following code: | To change contents in the database, I called the DB Engine direct with the following code: | ||
データベースの内容を更新するには、私は次のようにDBエンジンをダイレクトに呼び出します。 | データベースの内容を更新するには、私は次のようにDBエンジンをダイレクトに呼び出します。 | ||
− | + | <syntaxhighlight lang=pascal> | |
try | try | ||
sql:= 'UPDATE table SET setting=1'; | sql:= 'UPDATE table SET setting=1'; | ||
Line 353: | Line 350: | ||
MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message); | MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message); | ||
end; | end; | ||
− | + | </syntaxhighlight> | |
* ノート: | * ノート: | ||
Line 420: | Line 417: | ||
'''テーブルを作成する(Dataset)''' | '''テーブルを作成する(Dataset)''' | ||
− | + | コンポーネントアイコンをダブルクックするか、右マウスボタンのクリックで現れるポップアップメニューで、'Create Table'を選択します。 | |
− | + | ||
+ | 簡単な説明のあるテーブルエディタが表示されます。 | ||
+ | |||
+ | 下記はTSqliteDatasetとTSqlite3Datasetでサポートされているすべてのフィールドの型です。 | ||
− | |||
− | |||
Integer | Integer | ||
AutoInc | AutoInc | ||
Line 438: | Line 436: | ||
Currency | Currency | ||
− | ''' | + | '''データを取得する''' |
− | + | テーブルを生成した後か、以前作ったテーブルで作業する場合、Open手続きでデータセットを開いて下さい。 | |
− | + | SQLプロパティがセットしていない場合、すべてのフィールドのすべてのレコードを取得するためには、次のような1文をSQLにセットします。: | |
SQL:='Select * from TABLENAME'; | SQL:='Select * from TABLENAME'; | ||
− | ''' | + | '''データファイル上に変更を保存する''' |
− | + | ApplyUpdates関数を使うために, データセットは主キーの条件にあうための、少なくとも1つのフィールドを持っていなければなりません。(つまり、ユニークであって、NULLではない、という条件です。) | |
− | + | 更新をおこなうために2つの方法が可能です。 | |
− | * | + | * PrimaryKeyプロパティに主キーになっているフィールド名を指定する。 |
− | * | + | * AutoIncフィールドを加える。(これはTSqliteDatasetが自動的にそれを主キーとしてみなすので簡単です。) |
− | + | もし、2つの条件のうち、1つをセットしたら、次のように呼び出すだけです。 | |
ApplyUpdates; | ApplyUpdates; | ||
− | + | 追記1: もし、両方の条件がセットされたら、主キーによるフィールドが更新のために使われます。 | |
+ | |||
+ | 追記2:フィールドに主キーを設定することは、ApplyUpdateがコールされたときに、主キーによってデータをみつけられなくてはいけません。 | ||
+ | ですから、選択されたフィールドは、 Nullを含まないことや、一意であることを確認してください。 | ||
− | + | ===注意事項=== | |
− | + | * 10000レコードまではテストして、上手く動きますが、TSqliteDatasetはすべてのデータをメモリ上に置くため、必要なデータのみ受け取るようにしてください。(特にMemoフィールドなどに注意). | |
+ | * 同じデータファイルに、いくつかのテーブル、データセットを持たせることができます。 | ||
+ | * いくつかのデータセット(違うフィールドの組み合わせの)を同じテーブルから作ることができます。 | ||
+ | * SQLでWHERE文を使ってデータを選別することが可能です。クローズして再オープンする(あるいは、RefechDataメソッドをつかう)ことができます。この場合、並び順やフィールドの数は同じでなくてはなりません。 | ||
+ | * 複数のテーブルからaliasesやjoin,viewsなどを使って複雑なSQL文を使うことが可能です。(しかし、これらは同じデータファイルになくてはなりません。)しかしこの場合、ApplyUpdateは動作しません。もし複雑なクエリをつかって、データファイルに更新を加えたければ私(Luiz Américo)にメールしてください。そうすれば、どういうふうにおこなうか、ヒントをお伝えすることができます。 | ||
− | * | + | * TSqliteDatasetで生成されていない、そして、開いていないsqlite2.xのデータファイルにファイル名を設定するとき、一部のフィールドが正しい型を検出することが、許可されていません。これらは、stringフィールドとして扱われます。 |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 一般的なサンプルが、fpc/fcl/db/sqlite CVSディレクトリにあります。 | |
Luiz Américo | Luiz Américo | ||
Line 488: | Line 488: | ||
===FBLib Firebird ライブラリ=== | ===FBLib Firebird ライブラリ=== | ||
− | [http://fblib.altervista.org/|FBLib] | + | [http://fblib.altervista.org/|FBLib] はDelphi/Kylix、FreePascalとLazarusからFirebirdリレーショナルデータベースに直接アクセスする、(DataAwareではない)オープンソースライブラリです。 |
− | + | 現在、次のような特徴があります。 | |
− | * | + | * Firebird 1.0.x 1.5.x Classic SuperServer に直接接続します。 |
− | * | + | * マルチプラットホームです。 [Win32,Gnu/Linux,FreeBSD) |
− | * | + | * 自動的にクライアントライブラリを選択します。'fbclient' または 'gds32' |
− | * | + | * パラメータ型クエリのサポート |
− | * | + | * SQL Dialect 1/3をサポート |
− | * LGPL | + | * LGPL ライセンス |
− | * | + | * メタデータの抽出 |
− | * | + | * シンプルなスクリプトパーサ |
− | * | + | * 実行ファイルは100-150 KB しか増えません。 |
− | * | + | * BLOB フィールドをサポートします。 |
− | * | + | * HTML SQL Scriptへデータを出力します。 |
− | * | + | * サービスマネージャ (backup,restore,gfix...) |
− | * | + | * イベントアラータ |
− | + | 文書はここからダウンロードできます。[http://fblib.altervista.org/ FBLibのWebサイト]. | |
== Lazarus と dBase == | == Lazarus と dBase == | ||
Line 512: | Line 512: | ||
[[user:Tonymaro|Tony Maro]] | [[user:Tonymaro|Tony Maro]] | ||
− | + | このページも訪れるとよいでしょう。[[Lazarus Tdbf Tutorial|TDbf Tutorial page]] | |
− | + | FPCはDelphiのTTableコンポーネントとにた機能をもつ、"TDbf"([http://tdbf.sourceforge.net/ TDbf Website])と呼ばれる、シンプルなデータベースコンポーネントを含んでいます。 | |
+ | これは、基本的なdBaseファイルの機能の基本的なサブセットをサポートしています。これは、デフォルトではインストールされませんので、最初にすることはLazarusパッケージを"lazarus/components/tdbf" からインストールして、Lazarus IDEをビルドすることです。そうすれば、コンポーネントパレットにTDatasourceの次に現れます。 | ||
− | + | TDbfコンポーネントは他のデータベースコンポーネントに対して、次のような利点があります。すなわち、どんな種類のランタイムデータベースエンジンも必要としないことです。しかしながら、大きいデータベースをもつアプリケーションには最適ではありません。 | |
− | + | これを使うのは非常に簡単です。単に、フォームの上にTDbfをドロップしておいてください。ランタイムパスにデータベースファイルを置く場所を指定します。テーブル名をセットします。そして、TDatasourceコンポーネントにリンクします。 | |
− | + | しかしながら、もうちょっと努力して本格的な機能が求められます。テーブルがすでに存在しない場合、テーブルデザイナに相当するものがなければ(私はしりませんが)、プログラムからそれをつくる必要があります。 | |
− | + | 存在しないテーブルを開こうとすると、エラーが生成されます。テーブルはプログラムから、ランタイムパスとテーブル名をセットしたコンポーネントを通して、作ることができます。 | |
− | + | たとえば、あなたのDVDコレクションを記録するために"dvds"というテーブルを作る場合、フォームにTDbfコンポーネントをドロップして、ランタイムパスと"dvds"と名づけたテーブル名を設定してください | |
− | + | 結果ファイルは"dvds.dbf"となります。 | |
+ | コードでおこなう場合次のようなコードを入れてください。 | ||
+ | <syntaxhighlight lang=pascal> | ||
Dbf1.FilePathFull := '/path/to/my/database'; | Dbf1.FilePathFull := '/path/to/my/database'; | ||
Dbf1.TableName := 'dvds'; | Dbf1.TableName := 'dvds'; | ||
Line 536: | Line 539: | ||
end; | end; | ||
Dbf1.CreateTable; | Dbf1.CreateTable; | ||
+ | </syntaxhighlight> | ||
+ | このプログラムを走らせると、あなた用のDVDコレクションテーブルが作られます。その後、すべてのdata awareコンポーネントがTDatasourceを通してリンクされ、データに簡単にアクセスできるようになります。 | ||
− | + | インデックスを付加することは、典型的なTTableとはちょっと異なっています。データベースは開いていなくてはなりません。インデックスをリビルドするのと同じメソッドを使います。 | |
− | |||
− | |||
+ | 例えば: | ||
+ | <syntaxhighlight lang=pascal> | ||
Dbf1.Exclusive := True; | Dbf1.Exclusive := True; | ||
Dbf1.Open; | Dbf1.Open; | ||
Line 546: | Line 551: | ||
Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]); | Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]); | ||
Dbf1.Close; | Dbf1.Close; | ||
+ | </syntaxhighlight> | ||
+ | 最初のインデックス(プライマリインデックス)は、"dvdname.mdx"というファイルにはいっており、2番目のインデックスは、"rating.ndx"というファイルにはいっています。複数のテーブルがあるデータベースでは、同じファイル名を使わないよう注意を払ってください。 | ||
− | + | 今後、もっと詳細な例を作りたいと思っています。願わくば、昔Delphiに馴染んだ方々に立ち上がっていただき、Lazarusでデータベースのプログラムを作るきっかけになってほしいと思っています。 | |
− | |||
− | |||
== 関連のある記事 == | == 関連のある記事 == | ||
− | *[[Databases|Creating Databases Applications with Lazarus using the DB-unit]]<br> | + | *[[Databases/ja|Creating Databases Applications with Lazarus using the DB-unit]]<br> |
*[[MySQLDatabases|Creating a database application using MySQL]]<br> | *[[MySQLDatabases|Creating a database application using MySQL]]<br> | ||
*[[Zeos_tutorial|Creating a database application using the Zeos components]] | *[[Zeos_tutorial|Creating a database application using the Zeos components]] |
Latest revision as of 15:44, 1 April 2024
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
Bahasa Indonesia (id) │
italiano (it) │
日本語 (ja) │
Nederlands (nl) │
português (pt) │
русский (ru) │
中文(中国大陆) (zh_CN) │
中文(台灣) (zh_TW) │
概要
このチュートリアルは、Lazarusでいろいろなデータベースの操作を行うためのものです。 Lazarusでは、いくつかのデータベースを外部的にサポートしています。しかし、それぞれのデータベースにたいして開発者は適切なパッケージをインストールしなくてはなりません。 データベースには、コードを書いたり、フォーム上のコンポーネントをドロップしてアクセスすることができます。データアウェアコンポーネントは、DataSourceプロパティをTDatasetに設定することで、接続し、フィールドに対応して表示することができます。データソースはあるテーブルをあらわし、データベースコンポーネント(たとえば、TPSQLDatabase, TSQLiteDataSet)へDataSetプロパティをとおして接続されます。 データアウェアコンポーネントは、IDE上の"Data Controls"タブ上にあり、データソースとデータベースのコントロールは"Data Access"タブ上にあります。
Lazarus と MySQL
MySQLをLinuxやWindowsで動作させる
MySQL User Manualの指示に従って進めてください。インストール後、mysqldデーモンが動作していることを確認してください。また、セキュリティを保ちうる範囲で、すべての必要なホスト('localhost',ホスト名,ネットワーク上の他のホスト名)から、すべての必要なユーザー(ルート、mysql、あなた自身、他に必要なユーザーを含む)に、必要な権限が与えられているか、確認してください。
ルートを含むすべてのユーザがパスワードを持っているのが、望ましいです。 マニュアルにある例でデータベース・システムの機能をテストしてください。そして、本当にすべてのユーザが信頼できるアクセスができるかチェックしてください。
(訳注:データベースに接続できない場合、プログラムのプロパティの設定が悪い場合もありますが、そもそも、プログラムの前に、インストール、PCの設定、ユーザー、それぞれの権限の設定がきちんとできているか、データベースのサンプルなどであらかじめ確認しておくことが必要です。)
MySQLをFPCのテキストモードで動かしてみよう
例となるフォルダが$(fpcsrcdir)/packages/base/mysql/にあります。 LazarusのIDEで、menu -> Environment Options -> Paths tab -> FPC source directoryにFPCのソースディレクトリがあります。MySQLが置いてある可能性のあるディレクトリは、rpmによるインストールだと、/usr/share/fpcsrc/packages/base/mysql/ Windowsでは C:\lazarus\fpcsrc\packages\base\mysql\です。
このディレクトリには、mysql.pp, mysql_com.pp そして mysql_version.ppがあります。 テストスクリプトを実行する前に、testdbというデータベースを生成する必要があります。 これをおこなうには、MySQL monitorにrootとして、全権限をもってログインして、次のステートメントを発行します。
CREATE DATABASE testdb;
それから、すべて関連しているユーザが適切なアクセス権を持っていることを確認してください。
GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';
ここに、いま実行すべきであるmkdbと呼ばれるスクリプトがあります。
sh ./mkdb
システムが、匿名のユーザにデータベースへのアクセスを許可していないとき、これはたぶん失敗するでしょう。 その場合は、エディタをつかって、MySQLがその行を呼び出すように、スクリプトを変更してください。
mysql -u root -p ${1-testdb} << EOF >/dev/null
そして、再度mkdbを走らせてみます。プロンプトが出たら、パスワードを入力してください。
幸運にも、あなたは何とかテストデータベースを作成したに違いありません。MySQL monitorにログインしている間、 MySQLステートメントを発行して、テストしてください。
select * from FPdev;
そうすると、FPC開発者のID,ユーザー名、電子メールアドレスが表記されているテーブルを見ることができるでしょう。
今度は、testdb.ppというプログラムを実行させてみてください。 (これは、コンパイルしてください。ほとんど最初は失敗するでしょうけど) 私はこのプログラムはいくつかの理由でmysqlに接続できないことを発見しました。
- 私の環境(SuSE Linux v9.0)で mysql v4.0.15をインストールしました。パッケージが設計されたバージョン3ではありません。
- プログラムはデータベースにアクセスするためにユーザー名、パスワードが必要です。
- コンパイラに、どこにmysqlのライブラリを探せばいいか知らせる必要があります。(もしMySQLの開発ライブラリをインストールしていなければ、今インストールしましょう。)
私はオリジナルを修正したくなかったのでtestdb.ppからtrydb.ppと名づけてコピーを作成しました。オリジナルファイルはCVSを使ったアップデートで修正されてしまうからです。
私はさらに、mysql/ver40/というサブディレクトリの中のファイル群を、 メインのmysql/サブディレクトリに、それぞれのファイルの名前が規則性をたもつように、mysql_v4.pp, mysql_com_v4.pp,mysql_version_v4.ppと名前をかえてコピーしました。
私はtrydb.ppのusesを次のように変更しました。
uses mysql_v4
そして、mysql_v4.ppのusesも次のように変更しました。
uses mysql_com_v4
/etc/fpc.cfgに、自分のライブラリを指すように次の行を加えました。
-Fl/lib;/usr/lib
次のステップは、devel-librariesがあなたのためにリンクとしてインストールされている場合、必要ないかもしれませんが、チェックして損はありません。
私は/usr/libディレクトリのmysqlclintライブラリの本当の名前を調べる必要がありました。そして、私の場合、シェルコマンドを発行しました。
ln -s libmysqlclient.so.12.0.0 lmysqlclient
FPCがライブラリを見つけられるよう、シンボリックリンクを生成するために、です。 また、私は次のようなリンクを作成しました。
ln -s libmysqlclient.so.12.0.0 mysqlclient
そして、同じように色々なほかのディレクトリのリンクを設置しました。 厳密には、必要ではないのですが、このケースではそうしました。
他のユーザーでは、次のようなリンクが必要かもしれません。
ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
私はtrydb.ppをユーザーの詳細を含むように修正しました。最初にhost,user,passwordを定数としてもつように。
const
host : Pchar= 'localhost';
user : Pchar= 'myusername';
passwd: Pchar = 'mypassword';
それでも私は、mysql_connect()をコールしても、まだmysqlに接続できないでいました。しかし、より多くのパラメータを必要とするmysql_real_connect()を使うべきだったのです。さらに物事を複雑にしていたのは、多くのパラメータがversion3(パラメータは7個)とversion4(パラメータは8個)の間で変わっているように思えました。
また、mysql_real_connectを使う前に、mysql_init()を使う必要がありました。 これは、オリジナルのmysql.ppにはありませんでしたが、mysql_v4.ppにはあります。
ここまでで、接続するためのコードは次のようになりました。
{ いくつかの追加の変数 }
var
alloc : PMYSQL;
{メインプログラム断片}
begin
if paramcount=1 then
begin
Dummy:=Paramstr(1)+#0;
DataBase:=@Dummy[1];
end;
Writeln ('Allocating Space...');
alloc := mysql_init(PMYSQL(@qmysql));
Write ('Connecting to MySQL...');
sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
if sock=Nil then
begin
Writeln (stderr,'Couldn''t connect to MySQL.');
Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
halt(1);
end;
Writeln ('Done.');
Writeln ('Connection data:');
{$ifdef Unix}
writeln ('Mysql_port : ',mysql_port);
writeln ('Mysql_unix_port : ',mysql_unix_port);
{$endif}
writeln ('Host info : ',mysql_get_host_info(sock));
writeln ('Server info : ',mysql_stat(sock));
writeln ('Client info : ',mysql_get_client_info);
Writeln ('Selecting Database ',DataBase,'...');
if mysql_select_db(sock,DataBase) < 0 then
begin
Writeln (stderr,'Couldn''t select database ',Database);
Writeln (stderr,mysql_error(sock));
halt (1);
end;
{ ... testdb.ppの本来のコードとして }
それでは、tyrdb.ppのコンパイルを開始する準備はいいですか?
fpc trydb
成功しました!それでは実行してみましょう。
./trydb
おっ!FPC開発者のリストの一覧を得ることができました!
いくつかの、さらなる改善点があります。 ユーザーに関する詳細のエントリを作る時、あるいは、MySQLのコマンドを双方向にしたいとき、定数よりは変数の方がいいでしょう。そして、いくつかの発行したいSQLコマンドに、結果を返さないコマンドでも(full program listingを見てください)ユーザーの詳細情報をコンソールから入力する部分、プログラムがSQLコマンドがコンソールから入力されるループにはいる部分、結果等について、quitがキーボードから入力されるまで、プリントアウトできるようにしてください。
こちらを見てください。Sample Console Listing
LazarusアプリケーションからMySQLへの接続
このチュートリアルでは、基本的なLazarusコンポーネントのみを使って、LazarusでどのようにMySQLに接続するか、そして簡単なクエリを実行するかを示します。 このとき、Data Aware コンポーネントは使いません。しかし、データベースとインターフェースする原理を解説します。
Lazarusで新しいプロジェクトを生成してください。
Project -> New Project -> Application
自動的に生成されたフォームが現れます。 フォームをスクリーンの半分くらいになるように大きくして、フォームの名前とキャプションを、'TryMySQL'としてください。
コンポーネントパレットのStandardのタブから、3つのエディットボックスを、フォームの左上のほうへ置いてください。そして、それぞれのエディットボックスの真上にラベルを置いてください。 ラベルのキャプションを'Host'としてHostLabel,エディットをHostEditとしてください。 同様に、'UserName'としてUserLabel,UserEditとしてください。 同様に、'Password'としてPasswdLabel,PasswdEditとしてください。 これらのかわりに、LabeledEditコンポーネントをAdditionalタブから使うことができます。
PasswdEditを選択して、PasswordCharプロパティを見つけて、これを * か、他のキャラクタにしてください。そうすることで、画面にパスワードをキーボードから入力したときに表示されないように、かわりに、*の文字を表示するようにします。 それぞれのエディットボックスのTextプロパティが空白であることを確認してください。
ここでさらに、もうひとつエディットボックスとラベルを、フォームの右上に置いてください。 ラベルのCaptionを、'Enter SQL Command'に、NameをCommadEditにしてください。
3つのボタンをフォームに置きます。2つは、EditBoxの下の左のほうへ、もう一つは、右のコマンドボックスの下へ置いてください。
左のボタンは、Caption='Connect to Database'、Name='ConnectButton'、もうひとつは、Caption='Exit'、Name='ExitButton'としてください。右のボタンは Caption='Send Query'、Name='QueryButton'としてください。
大きなメモをフォームの右下に貼り付けて、使えるだけのスペースを使って配置して、'Result'と表示してName='ResultMemo'としてください。テキストがあふれたときに自動的にスクロールバーがつくように、ScrollBars='ssAutoBoth'にしてください。また、WordWrap='True'としてください。
Commonコントロールタブから、ステータスバーをフォームの下に置き、SimpleText='TryMySQL'としてください。
このフォームのスクリーンショットを置いておきます。:Mysql Example Screenshot
これで、必要なイベントハンドラを書くことが出来ます。 左にある3つのエディットボックスはホスト名、ユーザ名、パスワードの入力に使います。これらの3つの入力がきちんと終わったら、Connectボタンをクリックします。このボタンのOnClickイベントハンドラは、先ほどのテキストモードのFPCプログラムの一部とほとんど同じです。
データベースからのレスポンスはPascalのwrite文やwriteln文を使って書かれてはいません。しかし、返答はstringsに変換され、Memoに表示されます。Pascalのwriteとwriteln文は沢山の型変換を実行時に行う能力がある一方、Memoを使ってテキストを出力する際に、明確なデータ型変換をstringの正しい形式にすることが必要です。なので、PChar変数はStrPasを使って変換されなければならず、Integer変数はIntToStrを使って変換されなければなりません。
(訳注:Delphiで慣れた方々には当たり前に思えるかもしれませんが、本来、Pascalでの文字列形式出力はwriteやwritelnを使うものであり、それは、実行時に変数の型を明示しなくても、自動的に適切な文字列として表示することができます。)
文字列はMemoに下記のような関数をつかって表示されます。
procedure ShowString (S : string);
(* display a string in a Memo box *)
begin
trymysqlForm1.ResultsMemo.Lines.Add (S)
end;
Connectボタンのイベントハンドラは次のようにします。
procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
(* Connect to MySQL using user data from Text entry boxes on Main Form *)
var strg: string;
begin
dummy1 := trymysqlForm1.HostEdit.text+#0;
host := @dummy1[1];
dummy2 := trymysqlForm1.UserEdit.text+#0;
user := @dummy2[1] ;
dummy3 := trymysqlForm1.PasswdEdit.text+#0;
passwd := @dummy3[1] ;
alloc := mysql_init(PMYSQL(@qmysql));
sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
if sock=Nil then
begin
strg :='Couldn''t connect to MySQL.'; showstring (strg);
Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
end
else
begin
trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
strg := 'Now choosing database : ' + database; showstring (strg);
{$ifdef Unix}
strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg);
strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
{$endif}
Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
showstring (strg);
Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg);
Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg);
trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
if mysql_select_db(sock,DataBase) < 0 then
begin
strg :='Couldn''t select database '+ Database; ShowString (strg);
Strg := mysql_error(sock); ShowString (strg);
end
end;
end;
右のテキストボックスはSQL文を入力するものです。終了のセミコロンなしで良いです。 きちんとしたSQL文を入力して、SendQueryボタンを押すとクエリが実行され、ResultMemoの中に結果が表示されます。
SendQueryのイベントハンドラもFPCのテキストモードの時とほとんど同じですが、表示の際に明示的な型変換をおこなうことを除いてという点は、先ほどの例と同じです。
テキストモードのFPCプログラムと違う点は、エラーが検出されたときにプログラムは停止せず、MySQLもクローズされないところです。そのかわり、制御がメインフォームに戻り、コマンドが再発行できるように修正する機会が与えられます。
アプリケーションは最終的に、Exitボタンがクリックされたときに、MySQLをクローズして終了します。 SendQueryは次のようになっています。
procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
var
dumquery, strg: string;
begin
dumquery := TrymysqlForm1.CommandEdit.text;
dumquery := dumquery+#0;
query := @dumquery[1];
trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
strg := 'Executing query : ' + dumQuery; showstring (strg);
if (mysql_query(sock,Query) < 0) then
begin
Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
end
else
begin
recbuf := mysql_store_result(sock);
if RecBuf=Nil then
begin
Strg :='Query returned nil result.'; showstring (strg);
end
else
begin
strg :='Number of records returned : ' + IntToStr(mysql_num_rows (recbuf));
Showstring (strg);
Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
showstring (strg);
rowbuf := mysql_fetch_row(recbuf);
while (rowbuf <>nil) do
begin
Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +
rowbuf[2] +')';
showstring (strg);
rowbuf := mysql_fetch_row(recbuf);
end;
end;
end;
end;
プロジェクトを保存して、メニューからRun -> Runを選んでください。
MySQLのソースコードをダウンロードする
全ソースコードは次からダウンロードできます。Sample Source Code
Lazarus と PostGreSQL
これは、Lazarus 0.9.12以降と、PostGresSQLデータベースを、ローカル、リモートの両方でTPQConnectionを使って接続するためのとても短いチュートリアルです。
インストールを正しくおこなったの後で、次のステップをやってみてください。
- SQLdbタブから、PQConnectionを置く
- SQLdbタブから、SQLQueryを置く
- SQLdbタブから、SQLTransactionを置く
- DataAccessタブから、DataSourceを置く
- DataControlsタブから、DBGridを置く
- PQConnectionのプロパティを適切に設定してください。
- transaction propertyに、SQLTransactionオブジェクトを参照させる。
- Database name
- HostName
- UserName + password
- SQLTransactionが自動的にPQConnectionを示すように変更されたとこに注意してください。
- SQLQueryのプロパティを適切に埋めてください。
- transaction プロパティに適切なオブジェクト
- database プロパティに適切なオブジェクト
- SQL (たとえば、'select * from anytable' などとしてください。)
- DataSourceオブジェクトのDataSetプロパティに、SQLQueryオブジェクトを指定してください。
- DBGridオブジェクトのDataSourceプロパティにDataSourceオブジェクトを設定してください。
すべてをconnectedとactiveにすると、設計時においても、DBGridに表示がされます。 TDBTextとTDBEditは、私には、ただ値を表示するだけのように見えます。
To change contents in the database, I called the DB Engine direct with the following code: データベースの内容を更新するには、私は次のようにDBエンジンをダイレクトに呼び出します。
try
sql:= 'UPDATE table SET setting=1';
PQDataBase.Connected:=True;
PQDataBase.ExecuteDirect('Begin Work;');
PQDataBase.ExecuteDirect(sql);
PQDataBase.ExecuteDirect('Commit Work;');
PQDataBase.Connected:=False;
except
on E : EDatabaseError do
MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
on E : Exception do
MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
end;
- ノート:
- Lazarus 0.9.12 + PGSQL 8.3.1にて、Windowsでテストしました。
- Lazarus 0.9.12 and PGSQL 8.0.xで、Linuxでテストしました。
- インストレーションとエラー:
- Lazarus 0.9.12のテストバージョン では、"text" と "numeric" の型にバグがあります。
- 固定長のキャラクタと、intとfloat8では、私は問題なく使えました。
- 時々Lazarusを再起動することでくだらないエラーを解決できた
- いくつかのエラーの後で、トランザクションがアクティブのまま残り、手動でデアクティベートしなくてはならなかった。
- Lazarusによって行われた変更は、もちろん、トランザクションがコミットされるまでは見ることができません。(訳注:他のトランザクションでは、ということ)
- IDEのデバッガは(少なくともWindowsにおいては)バグがあるようです。時々IDEの外で走らせるとエラーの発生を見つけるのに役立ちます。
- Linuxでは、特定のエラーメッセージがコンソールに出力されることがあります。--もし、コマンドラインで走らせているなら、時々デバッグに役立つ情報があります。
- このようなエラーが発生することがあります。: "Can not load Postgresql client. Is it installed (libpq.so) ?"
- PostgreSQLをインストールした所から、libpq*を探して、パスに加えて下さい。
- Linuxでは、pathにlibpq.soファイルを、/etc/fpc.cfgの中のライブラリセクションに加えてください。たとえば、次のように:-Fl/usr/local/pgsql/lib
- Windowsでは、これらのライブラリを、環境変数のパスのどこにでも追加してください。また、プロジェクトディレクトリに加えてもかまいません。
- 私は、すべてのDLLを自分のパソコンのC:\Program Files\PostgreSQL\8.1\bin などに入れて、パスを通しています。
Lazarus と SQLite
Luiz Américo による
イントロダクション
TSQLLiteDatasetとTSQLLite3DatasetはTDatasetの派生クラスで、2.8.xと3.2.xのSQLLiteデータベースにアクセスします。下記は主な特徴と欠点です。
特徴:
- 自由度が高い: データベースはシンプルなテーブルレイアウトでも、複雑なSQLを使ってもよいので、プログラマは、SQLを使っても良いし、使わなくても良い。
- 自動データ更新: SQL文でデータベースを手動でアップデートする必要はありません。1つの命令で更新ができます。
- 高速: メモリにデータをキャッシュするため、データセットを高速にブラウズします。
- サーバーインストール、設定が不要:SQLLiteダイナミックライブラリと一緒に配布するだけです。
欠点
- 外部ファイルを必要とします。(sqlite library)
要求事項
- sqlite2のためには:
- fpc 2.0.0
- Lazarus 0.9.10
- sqlite runtime library 2.8.15 以上(www.sqlite.orgから)
- sqlite3のためには:
- fpc 2.0.2
- Lazarus 0.9.11 (svn revision 8443 以上)
- sqlite runtime library 3.2.1 以上 (www.sqlite.orgから)
Lazarusのプロジェクトを作る前に、次の事を確認してください。:
- SQLLiteライブラリがシステムパスか、実行できるディレクトリにあるかどうか。
- Linuxでは、cmemを メインプログラムのusesの最初のユニットにしているかどうか
使い方 (基本)
/components/sqlite にあるパッケージをインストールしてください。(ここにその方法があります。) 設計時に下記のプロパティをセットして下さい。
- FileName: sqliteファイルへのパス[必須]
- TableName: sql文で使うテーブル名[必須]
- Sql: SQLのSELECT文 [必要に応じて]
テーブルを作成する(Dataset)
コンポーネントアイコンをダブルクックするか、右マウスボタンのクリックで現れるポップアップメニューで、'Create Table'を選択します。
簡単な説明のあるテーブルエディタが表示されます。
下記はTSqliteDatasetとTSqlite3Datasetでサポートされているすべてのフィールドの型です。
Integer AutoInc String Memo Bool Float Word DateTime Date Time LargeInt Currency
データを取得する
テーブルを生成した後か、以前作ったテーブルで作業する場合、Open手続きでデータセットを開いて下さい。 SQLプロパティがセットしていない場合、すべてのフィールドのすべてのレコードを取得するためには、次のような1文をSQLにセットします。:
SQL:='Select * from TABLENAME';
データファイル上に変更を保存する
ApplyUpdates関数を使うために, データセットは主キーの条件にあうための、少なくとも1つのフィールドを持っていなければなりません。(つまり、ユニークであって、NULLではない、という条件です。)
更新をおこなうために2つの方法が可能です。
- PrimaryKeyプロパティに主キーになっているフィールド名を指定する。
- AutoIncフィールドを加える。(これはTSqliteDatasetが自動的にそれを主キーとしてみなすので簡単です。)
もし、2つの条件のうち、1つをセットしたら、次のように呼び出すだけです。
ApplyUpdates;
追記1: もし、両方の条件がセットされたら、主キーによるフィールドが更新のために使われます。
追記2:フィールドに主キーを設定することは、ApplyUpdateがコールされたときに、主キーによってデータをみつけられなくてはいけません。 ですから、選択されたフィールドは、 Nullを含まないことや、一意であることを確認してください。
注意事項
- 10000レコードまではテストして、上手く動きますが、TSqliteDatasetはすべてのデータをメモリ上に置くため、必要なデータのみ受け取るようにしてください。(特にMemoフィールドなどに注意).
- 同じデータファイルに、いくつかのテーブル、データセットを持たせることができます。
- いくつかのデータセット(違うフィールドの組み合わせの)を同じテーブルから作ることができます。
- SQLでWHERE文を使ってデータを選別することが可能です。クローズして再オープンする(あるいは、RefechDataメソッドをつかう)ことができます。この場合、並び順やフィールドの数は同じでなくてはなりません。
- 複数のテーブルからaliasesやjoin,viewsなどを使って複雑なSQL文を使うことが可能です。(しかし、これらは同じデータファイルになくてはなりません。)しかしこの場合、ApplyUpdateは動作しません。もし複雑なクエリをつかって、データファイルに更新を加えたければ私(Luiz Américo)にメールしてください。そうすれば、どういうふうにおこなうか、ヒントをお伝えすることができます。
- TSqliteDatasetで生成されていない、そして、開いていないsqlite2.xのデータファイルにファイル名を設定するとき、一部のフィールドが正しい型を検出することが、許可されていません。これらは、stringフィールドとして扱われます。
一般的なサンプルが、fpc/fcl/db/sqlite CVSディレクトリにあります。
Luiz Américo pascalive(at)bol(dot)com(dot)br
Lazarus と MSSQL
これはZeoslib (latest cvs)でおこなっています。ページの最後のリンクを見てください。
Lazarus と Interbase / Firebird
Install Packagesを見て下さい。このページにはどのようにIBやFBサーバーと接続するか、最初の小さいサンプルと説明があります。
この作業も最新のZeoslibにあります。
FBLib Firebird ライブラリ
[1] はDelphi/Kylix、FreePascalとLazarusからFirebirdリレーショナルデータベースに直接アクセスする、(DataAwareではない)オープンソースライブラリです。
現在、次のような特徴があります。
- Firebird 1.0.x 1.5.x Classic SuperServer に直接接続します。
- マルチプラットホームです。 [Win32,Gnu/Linux,FreeBSD)
- 自動的にクライアントライブラリを選択します。'fbclient' または 'gds32'
- パラメータ型クエリのサポート
- SQL Dialect 1/3をサポート
- LGPL ライセンス
- メタデータの抽出
- シンプルなスクリプトパーサ
- 実行ファイルは100-150 KB しか増えません。
- BLOB フィールドをサポートします。
- HTML SQL Scriptへデータを出力します。
- サービスマネージャ (backup,restore,gfix...)
- イベントアラータ
文書はここからダウンロードできます。FBLibのWebサイト.
Lazarus と dBase
このページも訪れるとよいでしょう。TDbf Tutorial page
FPCはDelphiのTTableコンポーネントとにた機能をもつ、"TDbf"(TDbf Website)と呼ばれる、シンプルなデータベースコンポーネントを含んでいます。 これは、基本的なdBaseファイルの機能の基本的なサブセットをサポートしています。これは、デフォルトではインストールされませんので、最初にすることはLazarusパッケージを"lazarus/components/tdbf" からインストールして、Lazarus IDEをビルドすることです。そうすれば、コンポーネントパレットにTDatasourceの次に現れます。
TDbfコンポーネントは他のデータベースコンポーネントに対して、次のような利点があります。すなわち、どんな種類のランタイムデータベースエンジンも必要としないことです。しかしながら、大きいデータベースをもつアプリケーションには最適ではありません。
これを使うのは非常に簡単です。単に、フォームの上にTDbfをドロップしておいてください。ランタイムパスにデータベースファイルを置く場所を指定します。テーブル名をセットします。そして、TDatasourceコンポーネントにリンクします。
しかしながら、もうちょっと努力して本格的な機能が求められます。テーブルがすでに存在しない場合、テーブルデザイナに相当するものがなければ(私はしりませんが)、プログラムからそれをつくる必要があります。
存在しないテーブルを開こうとすると、エラーが生成されます。テーブルはプログラムから、ランタイムパスとテーブル名をセットしたコンポーネントを通して、作ることができます。
たとえば、あなたのDVDコレクションを記録するために"dvds"というテーブルを作る場合、フォームにTDbfコンポーネントをドロップして、ランタイムパスと"dvds"と名づけたテーブル名を設定してください
結果ファイルは"dvds.dbf"となります。
コードでおこなう場合次のようなコードを入れてください。
Dbf1.FilePathFull := '/path/to/my/database';
Dbf1.TableName := 'dvds';
With Dbf1.FieldDefs do begin
Add('Name', ftString, 80, True);
Add('Description', ftMemo, 0, False);
Add('Rating', ftString, 5, False);
end;
Dbf1.CreateTable;
このプログラムを走らせると、あなた用のDVDコレクションテーブルが作られます。その後、すべてのdata awareコンポーネントがTDatasourceを通してリンクされ、データに簡単にアクセスできるようになります。
インデックスを付加することは、典型的なTTableとはちょっと異なっています。データベースは開いていなくてはなりません。インデックスをリビルドするのと同じメソッドを使います。
例えば:
Dbf1.Exclusive := True;
Dbf1.Open;
Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
Dbf1.Close;
最初のインデックス(プライマリインデックス)は、"dvdname.mdx"というファイルにはいっており、2番目のインデックスは、"rating.ndx"というファイルにはいっています。複数のテーブルがあるデータベースでは、同じファイル名を使わないよう注意を払ってください。
今後、もっと詳細な例を作りたいと思っています。願わくば、昔Delphiに馴染んだ方々に立ち上がっていただき、Lazarusでデータベースのプログラムを作るきっかけになってほしいと思っています。
関連のある記事
- Creating Databases Applications with Lazarus using the DB-unit
- Creating a database application using MySQL
- Creating a database application using the Zeos components
- Pascal Data Objects is a database API that worked for both FPC and Delphi and utilises native MySQL libraries for version 4.1 and 5.0. It's inspired by PHP's PDO class.
https://trac.synsport.com:8000/index.php/pdo/wiki (username/password is guest/guest)
Contributors and Changes
This page has been converted from the epikwiki version.