はじめに
本連載では、DBメンテナンスツールの開発を通して、Curlの特徴を紹介していきます。読者の皆さんがCurlで開発するときの参考になれば幸いです。
長崎県庁との関係性
長崎県は平成14年度に新たなIT調達方式「ながさきITモデル」を導入しました。このモデルは情報システムのコスト削減と地元IT企業の振興を目的としたものであることから、弊社にも参加機会が与えられ、平成15年から電子県庁システムの構築に関わらせていただています。
なお、長崎県では電子県庁システムの一部をオープンソースとして公開しています。以下のWebサイトよりダウンロードすることができます。
長崎県電子県庁システムはCurlで開発されている
およそ6000名の職員を抱える長崎県では、高い操作性とサーバ負荷の軽減を実現することのできるCurl言語を使って電子県庁システムの構築を行っています。現在、約30システムが稼動中です。
DBメンテツールを開発するに至った経緯
ながさきITモデルは県職員が主体となってシステムの開発・運用を行う仕組みのため、職員がデータベース(MySQL)を操作することが当たり前のように行われています。ですが、県職員はデータベースの専門家ではないため、複雑なSQLを書けと言ってもそうそうできるものではありません。そこで、簡単に操作できる便利ツールが必要になります。このような理由から開発されたのがこのマスタメンテナンスツールです。
以前、同様の主旨で開発されたPHP版がありましたが、これはテーブルやカラムの追加などがあるたびにプログラムの改修が必要でした。そこで、Curlの動的に入力コントロールを配置できる特性を活かして再開発を行いました。
Curlで開発する理由
MySqlを操作するツールは、「かねやん」「phpMyadmin」など無料で使えるものがいろいろと出回っています。これらのツールは、システム開発に関わったことのある人にとっては難なく使えますが、素人にとっては使いやすいものとはいえないでしょう。
例えば、「phpMyadmin」は機能が充実していますが、パッと見ただけでは最初にどのボタンを押せばよいかもわかりません。
また、「かねやん」のUIはわかりやすいのですが、データの取得、更新にはSQLを書かなければいけません。
こういった理由から、県職員の方に無理なく使っていただくためには、
- わかりやすいUIの実現
- SQLを書かずにデータ操作ができる
- 軽快に動く
この3つ課題をクリアしなければいけませんでした。それを実現するためにCurl言語は最適だったのです。
DBメンテツールの機能について
このツールは以下のような機能を持っています。
- データ新規登録・編集・削除
- データ一括更新・一括削除
- データ表示
- データベース作成
- データベース設定(データベースに和名を設定・データベースの削除)
- テーブル作成
- データ入力画面設定(データ入力画面での入力コントロールを設定します)
- テーブル設定(テーブルに和名の設定・テーブルの削除)
- 検索条件設定
- ユーザーアクセス設定(各ユーザーが使用できるDB・テーブルを設定します)
- テーブルコピー
- データバックアップ(バックアップの作成とデータの復元を行います)
- SQL実行(SQLを入力して実行します)
DBとの接続
DBメンテナンスツールでは、データベースとの接続をPHPを経由して行っています。
CurlからのPHP呼び出しには「HttpForm」を使用しています。PHPからの結果はXML形式で受け取り、Curl側でXMLを解析(パース)します。なお、サーバーサイドの言語はPHP以外でもOKです。
Curlのコントロール
DBメンテナンスツールでは、ユーザビリティの向上に力を入れています。その一例として、「ツリー」「グリッド」を使用しました。ポピュラーなGUIですが、Curlにも標準コントロールとして搭載されており、使い勝手のよい機能を持っています。
1.TreeControl
「かねやん」のデータベースをツリー表示するUIはとてもわかりやすいので、Curl版でも使用しています。Curlのツリービューは便利なコントロールで、ローカルアプリケーションのツリービューと同じように動作します。ノードが選択されたイベント、開いたときのイベントなども取得できます。
カスタムすることで、先頭にアイコンをつけたり、ノードに画像を表示することもできます。DBメンテナンスツールでは、先頭にアイコンをつけて、DB、テーブルをわかりやすく表示するようにしました。
TreeControlのコンストラクタの「tree-item-creation-proc」を設定することでアイコンを追加できます。
tree-item-creation-proc = {proc {x:TreeNode}:TreeItem let v_icon:any = null {switch (x asa MyTreeNode).icon-type case my-tree-head do set v_icon = null case my-tree-db do set v_icon = {DefaultPixmapTreeIcon {Pixmap.from-url {url "../../default/images/db.gif"}} } case my-tree-group do set v_icon = {DefaultPixmapTreeIcon {Pixmap.from-url {url "../../default/images/group.gif"}} } case my-tree-table do set v_icon = {DefaultPixmapTreeIcon {Pixmap.from-url {url "../../default/images/tbl.gif"}} } else set v_icon = null } {return {DefaultTreeItem x, icon = v_icon } } }
ノード選択のイベントも取得できるので、DBとテーブルの情報を一括で取得するのではなく、DBノードが選択されたときのイベントで、そのDBにあるテーブルを取得して下位ノードに表示するようにして初期起動を速くしています。
2.RecordGrid
こちらはVisual BasicやDelphiにあるようなグリッドコントロールです。一覧表示ができ、見出し列をクリックするとソートすることもできます。
RcordGridはデフォルトではグレーで地味な感じですが、これもプロパティで変更できます。
{RecordGrid grid-line-color = "#758294",||色の変更 font-size = 10pt, alternate-row-background = "#E1E1E1",||一行おきの色の変更 select-current-record? = false,||行の選択を不可に cells-take-focus? = false ,||セルの選択を不可に width = 500, height = 300, header-options = {RecordGridRowOptions background = "#B0D0FF",halign = "left"},||カラムヘッダーの色の変更 background="white",||色の変更 display-navigation-panel? = false,||ナビゲーションバー非表示 display-record-selectors? = false||データセレクター非表示 } }
通常は、テキストの表示に使いますが、グリッド内にコントロールをのせることもできます。
上記の方法でDBメンテナンスツールのデータ一覧表示を行っています。
まとめ
ツリーとグリッドの2つを組み合わせることで、ローカルアプリケーションと同じ操作感を実現できました。Curlには、ツリーやグリッド以外にも質の高い標準コントロールが揃っていますし、カスタマイズもしやすいので、ユーザーのイメージを簡単に実現できます。これらを活用することで、従来のWebシステムでは実現が難しかった画面を、あまり時間をかけずに作成できます。
次回は表示パフォーマンスについてです。大量のデータを取得するSQLを発行すると、どうしても表示に時間がかかってしまいます。これを改善する方法を説明していきます。