Symfoware

Symfowareについての考察blog

Mantis 1.2系で実装されたpluginを作成する(履歴データの追加)

前回、プラグインで使用するデータベースにデータの登録を行いました。

Mantis 1.2系で実装されたpluginを作成する(データの登録・取得)

その続きを試してみます。




履歴データの追加



独自のデータ追加、更新が行えるようになりました。
おまけとして、履歴のデータを書き込む処理を追加し、誰がデータを
更新したかわかるようにしてみます。


履歴データ出力のAPIをもっているのは、「core/history_api.php」

関数の一覧を眺めてみると「history_log_event_direct」という
関数が使えそう。


history_log_event_direct([issue_id]、[項目名], [変更前の値], [変更後の値])



これを渡してやるだけで、履歴テーブルにデータをしてくれます。

util.phpに処理を組み込んでみました。



<?php

function get_extra_data($p_bug_id) {
    $extra_data = Array('package_name' => '', 'class_name' => '', 'method_name' => '');
    
    $c_bug_id = db_prepare_int( $p_bug_id );
    
    #テーブル名を取得
    $extra_data_table = plugin_table( 'sample' );
    
    $query = 'SELECT * FROM ' . $extra_data_table . ' WHERE bug_id = '. db_param();
    $result = db_query_bound( $query, Array( $c_bug_id ) );
    
    if (0 < db_num_rows( $result )) {
        $extra_data = db_fetch_array( $result );
    }
    
    return $extra_data;
}

function update_extra_data($p_bug_id, $p_pkg_text, $p_class_text, $p_method_text) {
    $c_bug_id = db_prepare_int( $p_bug_id );
    
    #テーブル名を取得
    $extra_data_table = plugin_table( 'sample' );
    
    $query = 'SELECT * FROM ' . $extra_data_table . ' WHERE bug_id = '. db_param();
    $result = db_query_bound( $query, Array( $c_bug_id ) );
    
    #データベースに登録する値
    $params = Array();
    #ログ出力用
    $history_logs = Array();
    
    #データなしのため、INSERT
    if (db_num_rows( $result) == 0) {
        $query = 'INSERT INTO ' . $extra_data_table;
        $query .= ' (bug_id, package_name, class_name, method_name, last_modified, date_submitted)';
        $query .= ' VALUES ';
        $query .= ' ('.db_param().','.db_param().','.db_param().','.db_param().','.db_param().','.db_param().')';
        
        $params[] = $c_bug_id;
        $params[] = $p_pkg_text;
        $params[] = $p_class_text;
        $params[] = $p_method_text;
        $params[] = db_now();
        $params[] = db_now();
        
        #空白以外だったら追加とみなす
        if (!is_null($p_pkg_text)) {
            $history_logs[] = Array('修正対象パッケージ追加', '' , $p_pkg_text);
        }
        if (!is_null($p_class_text)) {
            $history_logs[] = Array('修正対象クラス追加', '' , $p_class_text);
        }
        if (!is_null($p_method_text)) {
            $history_logs[] = Array('修正対象メソッド追加', '' , $p_method_text);
        }
        
    #データ存在のため、UPDATE
    } else {
        $old_data = db_fetch_array( $result );
        
        $query = 'UPDATE ' . $extra_data_table;
        $query .= ' SET ';
        $query .= ' package_name = ' . db_param() . ',';
        $query .= ' class_name = ' . db_param() . ',';
        $query .= ' method_name = ' . db_param() . ',';
        $query .= ' last_modified = ' . db_param();
        $query .= ' WHERE (bug_id = ' . db_param() . ')';
        
        $params[] = $p_pkg_text;
        $params[] = $p_class_text;
        $params[] = $p_method_text;
        $params[] = db_now();
        $params[] = $c_bug_id;
        
        #値が変更されていたらログ出力
        if ($p_pkg_text != $old_data['package_name']) {
            $history_logs[] = Array('修正対象パッケージ更新', $old_data['package_name'] , $p_pkg_text);
        }
        if ($p_class_text != $old_data['class_name']) {
            $history_logs[] = Array('修正対象クラス更新', $old_data['class_name'] , $p_class_text);
        }
        if ($p_method_text != $old_data['method_name']) {
            $history_logs[] = Array('修正対象メソッド更新', $old_data['method_name'] , $p_method_text);
        }
        
    }
    
    #登録実行
    db_query_bound( $query, $params );
    
    #ログに書き込み
    foreach ($history_logs as $history_log) {
        history_log_event_direct( $c_bug_id, $history_log[0], $history_log[1], $history_log[2]);
    }
}







データの追加や更新をおこなってみると、ちゃんと履歴データが
作成されました。

05_001_20101211183036.png



これで登録機能は一通り完成したかと思います。
次は、Mantisのメニューにリンクを追加し、一覧画面を作成しようと思います。











テーマ:プログラミング - ジャンル:コンピュータ

  1. 2010/12/11(土) 18:31:43|
  2. CouchDB
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

couchdbkitでCouchDBにファイルを登録する

Python + couchdbkitでCouchDBに画像ファイルを登録してみたいと思います。

ドキュメントが見つけられず苦労しました。。。



参考ソース



ドキュメントが見つけられなかったので、couchdbkitのテストコードを参考にしました。
http://github.com/benoitc/couchdbkit/blob/master/tests/client_test.py

290行目付近の、testInlineAttachmentsを参考にしています。




_attachments



CouchDBで_idや、_revというキーが特別な意味を持っているのと同じく、
_attachmentsも特別な意味を持つキーワードでした。

このキー配下にファイルのデータが格納されます。

_attachments/[ファイル名]/data
ここに登録したいファイルのバイナリを指定してやります。




サンプルコード



サンプルとして、CouchDBのロゴを登録してみました。
eatというデータベースのidが0000のデータに対し、logo.pngというファイル名で登録しています。



# -*- coding:utf-8 -*-

from couchdbkit import *

#接続するCouchDBのURL
uri = "http://192.168.1.245:5984"

#接続
server = Server(uri)

#eatというデータベースを作成
db = server.get_or_create_db('eat')


f = open("logo.png", "rb")

doc = {}
doc['_id'] = '0000'
doc['description'] = u"画像登録サンプル"

#ファイルを読み込んで連想配列に設定
attach = {}
attach['data'] = f.read()


#ファイル名をキーに、データを設定
attachments = {}
attachments['logo.png'] = attach
doc['_attachments'] = attachments

""" 要するに、以下の形式のデータを作成する
doc = {'_id': "0000",
            "description": u"画像登録サンプル",
            "_attachments": {
                "logo.png": {
                    "data": f.read()
                }
            }
        }
"""

f.close()

db.save_doc(doc)





プログラム実行後、Futonの様子はこんな感じになります。

01_001_20100212182701.png




ファイルの参照



getでアクセスしてやると、画像ファイルが表示されました。

形式は、
http://[サーバー名]:[ポート番号]/[データベース名]/[ドキュメントのID]/[ファイル名]

上記のサンプルプログラムだと
http://192.168.1.245:5984/eat/0000/logo.png
こうなります。

01_002_20100212182701.png



地味に苦労しました。。。






テーマ:データベース - ジャンル:コンピュータ

  1. 2010/03/06(土) 12:12:33|
  2. CouchDB
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

couchdbkitでデータベース接続時エラーが発生する

CouchDBを使って、プログラムを作成しようとしてます。
久しぶりにCouchDBを使うので、まずはデータベース作成のサンプルを書いて
思い出そうかと。


# -*- coding:utf-8 -*-

from couchdbkit import *

#接続するCouchDBのURL
uri = "http://192.168.1.245:5984/"

#接続
server = Server(uri)

#eatというデータベースを作成
db = server.get_or_create_db('eat')





CouchDBに接続して、データベースを作成するだけの簡単なサンプルですが・・・



C:\>python couch_sample.py
Traceback (most recent call last):
File "couch_sample.py", line 9, in <module>
    db = server.get_or_create_db('eat')
File "c:\python25\lib\site-packages\couchdbkit-0.4.2-py2.5.egg\couchdbkit\clie
nt.py", line 129, in get_or_create_db
    server=self)
File "c:\python25\lib\site-packages\couchdbkit-0.4.2-py2.5.egg\couchdbkit\clie
nt.py", line 247, in __init__
    server.res.head('/%s/' % url_quote(dbname, safe=":"))
File "build\bdist.win32\egg\restkit\rest.py", line 126, in head
File "c:\python25\lib\site-packages\couchdbkit-0.4.2-py2.5.egg\couchdbkit\reso
urce.py", line 153, in request
    payload=body, headers=headers, **params)
File "build\bdist.win32\egg\restkit\rest.py", line 225, in request
restkit.errors.RequestFailed: {'msg': '', 'status': 500, 'response': <couchdbkit
.resource.CouchDBResponse object at 0x00F1D3F0>}




前は、このコードで通ったと思うのですが・・・


couchdbkitのソースを見てみると


def __init__(self, uri='http://127.0.0.1:5984',
        uuid_batch_count=DEFAULT_UUID_BATCH_COUNT, resource_instance=None):



どうやら、最後にスラッシュを含めちゃダメみたい。



# -*- coding:utf-8 -*-

from couchdbkit import *

#接続するCouchDBのURL
uri = "http://192.168.1.245:5984"

#接続
server = Server(uri)

#eatというデータベースを作成
db = server.get_or_create_db('eat')





このコードでちゃんとデータベースが作成できました。
仕様変わったのかな?





テーマ:データベース - ジャンル:コンピュータ

  1. 2010/03/05(金) 12:10:04|
  2. CouchDB
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

CouchDBのデータベース名一覧をJSONPを使用して取得する(jQuery使用)

JSONPを使用して、CouchDBに作成しているデータベース名の一覧を
取得することができました。

CouchDBのデータベース名一覧をJSONPを使用して取得する

しかし、ちょっとめんどくさい。

jQueryでJSONPを実行したほうがお手軽そうです。



CouchDBのデータベース名取得



jQueryでJSONP
こちらを参考にさせていただきました。


<html lang="ja">
<head>
    <meta http-equiv="content-script-type" content="text/javascript">
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>jQuery + JSONP</title>
    <script type="text/javascript" src="script/jquery-1.3.2.js"></script>
    <script type="text/javascript">
    
    //画面構築完了後
    $(function() {
        
        //ボタンのクリックイベントで
        $("#btn_1").click(function(){
            
            //CouchDBサーバーからデータベースの一覧を取得する
            $.getJSON("http://192.168.1.251:5984/_all_dbs?callback=?", function(data){
                var rows = "";
                
                //テーブルとして表示するため、htmlを構築
                for (i = 0; i < data.length; i++) {
                    rows += "<tr><td>";
                    rows += data[i];
                    rows += "</td></tr>";
                }
                
                //テーブルに作成したhtmlを追加する
                $("#tbl").append(rows);
            });
        });
        
    });

    </script>
</head>
<body>
    <input id="btn_1" type="button" value="データ取得" />
    <table id="tbl" border="1">
        <tbody>
            <tr>
                <th>データベース</th>
            </tr>
        </tbody>
    </table>
</body>
</html>



callback=?という記載を行うことで、引数の関数がコールバック関数として
呼び出されるようです。

最初に表示した画面
02_01_20091127000525.png

データ取得ボタンを押すと、ちゃんとデータベース名の一覧が取得できました。
02_02_20091127000525.png






テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/25(月) 12:18:33|
  2. CouchDB
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

CouchDBのデータベース名一覧をJSONPを使用して取得する

CouchDBから取得できる値はJSON形式なので、Javascriptとの
親和性が高いです。

CouchDBが稼動しているサーバーでWebアプリケーションを作成する場合は
問題ないのですが、WebサーバーとCouchDBサーバーを分けたい場合には、
クロスドメインとなるため、JavaScriptでデータを取得するのが難しくなります。

そんなときはJSONPです。



JSONPでデータベースの一覧を取得する



http://[CouchDBサーバーIP]:5984/_all_dbs
このアドレスにアクセスすると、


["data_base_1","data_base_2"]



こんな感じで、データベース名の一覧がJSON形式で表示されると思います。


下記のように、callbackというパラメーターをつけると
http://[CouchDBサーバーIP]:5984/_all_dbs?callback=func_name


func_name(["data_base_1","data_base_2"]);



CouchDBサーバーから、JSONPに使える文字列が返却されます。
この機能を使用して、JSONPによりデータベース名の一覧が
取得できます。




データベース名の一覧を表示するサンプル



JSONPを使ってJavaScriptだけでマッシュアップ
ここを参考にさせていただきました。

サンプルアプリケーションは以下のとおり。


<html lang="ja">
<head>
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>JSONP</title>
</head>
<body>
<script type="text/javascript">
<!--
//データベース名を取得する
function getDBs() {
var url = "http://192.168.1.251:5984/_all_dbs?callback=showDBList";
callJSONP(url);
}

//JSONPを実行する関数
function callJSONP(url) {
var target = document.createElement('script');
target.charset = 'utf-8';
target.src = url;
document.body.appendChild(target);
}

//JSONPの結果として実行される関数
function showDBList( doc ) {
    var target = document.getElementById('dbs');
    for (i = 0; i < doc.length; i++) {
        target.innerHTML += doc[i] + '<br>';
    }
}
-->
</script>
<input type="button" value="データ取得" onclick="getDBs()" >
<div id="dbs" />
</body>
</html>



画面を表示したときはボタンだけ。
01_01_20091127000256.png

ボタンを押すと、データベースの一覧が表示できました。
01_02_20091127000256.png


これで、JavaScriptだけでアプリケーションを作成するめどがたちました。





テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/25(月) 12:11:18|
  2. CouchDB
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ