‘MySQL’ カテゴリーのアーカイブ

Docker公式イメージで開発用RDBをゲットだぜ(MariaDB、Percona Server編)

まえがき

Docker公式イメージで開発用RDBをゲットだぜ(PostgreSQL編)
Docker公式イメージで開発用RDBをゲットだぜ(MySQL編)

に続き予定どおりMariaDB編をお送りします。一言で済むので結論を書くと

「公式イメージのページを読み比べたらMySQLと同じでした。ありがとうございます」

という内容です。ついでに

というわけでPercona Serverの公式イメージのページも見てみたらこれもMySQLの場合と同じ扱いでしたので含めてみましたよ。

Docker for Macを使用しております。

(さらに…)

Facebooktwittergoogle_pluslinkedintumblrmail

Docker公式イメージで開発用RDBをゲットだぜ(MySQL編)

まえがき

Docker公式イメージで開発用RDBをゲットだぜ(PostgreSQL編)

に続きMySQL編です。Docker for Macを使用しております。はじめるよ〜。

(さらに…)

Facebooktwittergoogle_pluslinkedintumblrmail

OpenCOBOLとファイル操作(弊社拡張)

OpenCOBOLからのファイル操作ですが内部での定義によって幾つか種類があります。

  1. 固定長レコードのシーケンシャルファイル
  2. 固定長レコードのISAM形式ファイル
  3. 可変長レコードのシーケンシャルファイル

これらはCOBOLソース内でのSELECT句での定義でファイル名を直接または環境変数を経由して間接的に指定することが可能です。OpenCOBOLの素の状態ですと

          SELECT ADBF0320 ASSIGN TO "FILE0001"
                                ORGANIZATION  SEQUENTIAL
                                ACCESS  MODE  SEQUENTIAL.

と記述されている場合は、FILE0001または環境変数 DD_FILE0001または dd_FILE0001に設定されているファイル名のファイルのOPENが可能です。弊社ではこの環境変数渡しの機能を活用してperlからOpenCOBOL側へJCL中で使用しているファイル名を渡しています。
さて、JCL中ではSYSINと呼ばれる形式でファイルを作らずにその場で渡したいデータを記述することがあります。

\INPUT ACCEPT1,TYPE=DATASSF,LIST=YES
4241122 登録データ1
4241122 登録データ1追加分
\ENDINPUT;

ADAM2200:
\STEP PROG2000 FILE=USL.CAT1  DUMP=DATA SUBLM=NORMAL;
\ASSIGN FILE0010 USR.F001    SHARE=ALL HOLDMODE=NO;
\ASSIGN FILE0110 USR.F011-T  FILESTAT=TEMP   PUBLIC NORMAL=PASS;
\ALLOCATE FILE0110  USR.F011-T SIZE=05;
\DEFINE FILE0110  RECSIZE=57 BLOCKSZ=10260 INCRSZ=01
                     RELSP RECFORM=FB;
\ASSIGN SIN      ACCEPT1        FILESTAT=SYSIN;
\ENDSTEP;

上記ではJCL中で定義されたASSIGN1というSYSINの内容をSINというファイル識別名に割り当てています。これをperlに置き換える(この部分自動的に処理しています)と

INPUT "ACCEPT1,TYPE=DATASSF,LIST=YES",<<_EOT;
4241122 登録データ1
4241123 登録データ1追加分 
_EOT
ENDINPUT;

ADAM2200:
STEP "PROG2000 FILE=USL.CAT1  DUMP=DATA SUBLM=NORMAL";
ASSIGN "FILE0010 USR.F001    SHARE=ALL HOLDMODE=NO";
ASSIGN "FILE0110 USR.F011-T  FILESTAT=TEMP   PUBLIC NORMAL=PASS";
ALLOCATE "FILE0110  USR.F011-T SIZE=05";
DEFINE "FILE0110  RECSIZE=57 BLOCKSZ=10260 INCRSZ=01",
                     "RELSP RECFORM=FB";
ASSIGN "SIN      ACCEPT1        FILESTAT=SYSIN";

上記のように変換しています。さて、SYSINの内容ですがまず1レコードが何byteであるという情報がありません。そして1行毎に行の長さが異なっています。今回移植の対象となった対象機のCOBOLではこのような場合には「改行区切りで1レコード」とするようになっていました。つまり可変長レコードです。ところがOpenCOBOLで可変長レコードをファイルとして扱うためには:
レコード先頭1バイトまたは2バイトにレコード長+1レコード分のデータ
レコード先頭1バイトまたは2バイトにレコード長+1レコード分のデータ
・・・
という形式でデータを作成する必要があります(つまり1byte目がレコード長として正しくないと、メモリ上に過大な長さのデータが読み込まれて、あっという間にSegfault します)。OpenCOBOLの外側からファイルの形式について何らかの方法で指示を出す必要が在りましたので、弊社ではファイル名の先頭に「sysin://」という識別子を(URI的に)付けてファイル名を渡すようにしています。これをOpenCOBOL内のファイルハンドラに渡る前に処理し、改行区切りの可変長レコードとして処理しています。同じく、印刷用の中間データなど1行の長さが可変長となる場合について「sysout://」という識別子を付けて指定することができるようにしています。他、標準の固定長レコードのドライバと動作をちょっと変えたドライバを使いたい場合を考え「misam://」や「mseq://」さらにLinux他では/dev/nullに該当するものとして「nullfs://」という識別子を指定可能としています。
標準の固定長レコードのドライバと動作をちょっと変えたいというのは例えばレコード挿入、削除時の細かい振る舞い、二次キー指定時の動作、二次キーを持っているISAMファイルを主キーしか定義していないCOBOLソースから書き込みモードで開いた場合の動作(OpeCOBOLの標準の動作では、書き込みモードでISAMファイルを開くと、一旦削除されますので、最悪二次キーについての定義が欠落します)等々です。
また、「perlfs://CLASSNAME/param」という形式でファイル名を渡す事によりファイルハンドラとしてperlにて記述したものを呼び出すようにもしています。DBとCOBOL内の固定長レコードの編集用コードについてperlで記述できるため、大変柔軟にDBとの連携を図れるようになりました(つまり、DBD::PgやDBD:MySQL、Oracleなどとの連携も可能です。MySQLについては既に運用されていますし、KeyValue系のDBへの接続もそれほどの変更なしに実装できます)。
上記に加え、固定長レコードやキー定義などの情報を別ディレクトリ内の管理ファイルに登録しておくことで、ファイルオープン時に正しい形式のファイルを使用しているかどうかCOBOLプログラム内の定義と照らし合わせて動的にチェックできるようになり、また現在どのようなファイルがオープン状態であるか?を全てモニタできるようにしています。
これらの改造はOpenCOBOLがオープンソースとして配布されていたことで可能になりました。成果は随時コミュニティ等にフィードバックしていきたいと考えております。

Facebooktwittergoogle_pluslinkedintumblrmail

恥ずかしながら PHP + MySQL + シフトJIS でハマりました

「今更こんなことやっちゃうとはなぁ」というたぐいの話です。

mysql_query(“SET NAMES ‘CP932′”, $conn);

とかやっちゃうとMySQLには文字コードを教えてるけどPHPには伝わらないので

mysql_set_charset(‘CP932’);

としてPHPにも教えてあげなさいとバグるぜって話。セキュリティホールにもなります。

シフトJISには文字コード中に\(5C)が含まれる文字があるのでPHPさんがUTF8気分で mysql_real_escape_string すると\が挿入されてバグるわけです。

昔、Rails関係でも SET NAMES ダメ絶対って話を読んだような。UTF8ばかり使っててボケたかね。

詳しくは『SET NAMESが危険な理由のおさらい』に簡潔にまとめてくださってるのでそちらをどうぞ。

Facebooktwittergoogle_pluslinkedintumblrmail

mysqld_multiを使って同一マシンに複数のMySQLサーバを立てる

業務で複数MySQLの開発環境が必要になりました。VM作っても良かったのですが、いちいち立ち上げたくなかったのと、Mac1台で完結させたかったのでTwitterでその旨つぶやいたら、とある方からmysqld_multiというものを教えて頂きました。

私はHomebrewでMySQL5.1を入れていたのですが、

$ ll /usr/local/Cellar/mysql51/5.1.58/bin/ | grep mysqld_multi
-r-xr-xr-x  1 dataich  staff    24334 11  1 14:17 mysqld_multi

おお、既に入ってました。

でmy.cnfに設定を書いてあげます。[mysqld1][mysqld2][mysqld3]という感じでオプショングループを書いてあげてそれぞれの設定を記述します。

この状態で

$ mysqld_multi start

とすれば全部立ち上がります。
またマニュアルにもありますが、特定のサーバだけ立ち上げることも可能です。

なんで今まで知らなかったのかと後悔してます。
まあアプリ側がちゃんとポート指定に対応していないと残念なことにはなりますが、非常に便利に使えそうです。
ちなみにWindows開発環境では、多分別の社員さんが書いてくれると思います。

Facebooktwittergoogle_pluslinkedintumblrmail