MySQLからDBIx::Classで取ってきたデータをJavascriptで取得してみよう!

<はじめに>
3層構造かつmemcachedの練習です。
1)MySQLに格納されているデータをDBIx::Classで取得します。
2)無意味に一旦memcachedに格納した後に取り出してみます。
3)XML::SimpleやらJSONやらで加工してみます。
4)1)〜3)で作ったデータをjavascriptで取得します。


<プログラムについて>
[サーバー側]
DBIx::ClassMySQLにアクセス!

 10 #---------------------------------------------------------------------------- 
 11 # get Data from MySQL 
 12 #
 13 my $schema = MyApp::Schema->connect('dbi:mysql:ASUKA','user','pass');
 14 
 15 $schema->storage->dbh->do("SET names utf8");
 16 
 17 my @all_TODOFUKEN    = $schema->resultset('MDTDFKN')->all;
 18 my @tempHashArray    = ();
 19 
 20 foreach $todofuken (@all_TODOFUKEN)
 21 {
 22     my %tempHash = ('TODOFUKEN_ID'       => decode("utf8", $todofuken->TODOFUKEN_ID)       ,
 23                     'TODOFUKEN_MEI'      => decode("utf8", $todofuken->TODOFUKEN_MEI)      ,
 24                     'TODOFUKEN_MEI_KANA' => decode("utf8", $todofuken->TODOFUKEN_MEI_KANA));
 25     push(@tempHashArray, \%tempHash);
 26 }

■無意味にmemcachedに出し入れしてみる

 28 #----------------------------------------------------------------------------
 29 # use Memcached
 30 #
 31 my $key     = "hash";
 32 my $value   = \@tempHashArray;
 33 my $expires = 3600;
 34 my $memcached = Cache::Memcached->new(
 35                 {
 36                     servers => ["127.0.0.1:11211"],
 37                     compress_threshold => 10_000
 38                 });
 39
 40 $memcached->add($key, $value, $expires);
 41 
 42 my $tempData = $memcached->get($key); 
 43 my @tempData = @$tempData;

XMLっぽく加工(XMLについては著しく勉強不足…)

 50 #----------------------------------------------------------------------------
 51 # Make XML data
 52 #
 53 print "\n\nXML DATA---------------------------------------------------\n\n";
 54 
 55 my $xs       = XML::Simple->new();
 56 
 57 foreach $_ (@tempData)
 58 {
 59     my $item = $xs->XMLout($_);
 60 
 61     print encode("utf8", $item);
 62 }

■JSON形式に加工

 64 #----------------------------------------------------------------------------
 65 # Make JSON data
 66 #
 67 print "\n\nJSON DATA--------------------------------------------------\n\n";
 68 
 69 foreach $_ (@tempData)
 70 {
 71     my $item = encode_json($_);
 72 
 73     print $item, "\n";
 74 }

[クライアント側]
Javascriptでサーバー側からデータを取得

  7 httpRequest = false;
  8 httpRequest = new XMLHttpRequest();
  9 httpRequest.overrideMimeType('text/xml');
 10 
 11 function request()
 12 {
 13     httpRequest.abort();
 14     httpRequest.open("GET","http://hogehoge/fuga.cgi",true);
 15     httpRequest.onreadystatechange = function()
 16     {
 17         if(httpRequest.readyState == 4)
 18         {
 19             if(httpRequest.status == 200)
 20             {
 21                 window.alert("Success!!");
 22                 document.getElementById('pageText').value = httpRequest.responseText;
 23             }
 24         }
 25     }
 26     httpRequest.send(null);
 27 }


<まとめ>
DBIx::Class使ってみると、データ取得した後にDBのカラム名をキーに
hashを作りたくなるんだけど、べた書きだとあんまりかっこよくない。
カラム名のデータはどこからか取れないのかなー?なんて思ったり。
今回はそこまでやりませんでしたけど、javascriptでデータ取得した後に
XMLなりJSONなりをどうやって加工しようかな?なんて思ったり。
このネタでもう少し遊べそうです。