Web開発フレームワークでの
アプリケーションの処理フロー

  下図は、Webアプリの画面操作で、イベントが発生してから、Ajaxでデータベースにアクセスし、
その結果を画面に反映するまでの、処理の流れを①~⑧の番号で記述したものです。
このページは、CGJSフレームワークの使い方を一覧検索のWeb画面とDB登録のWeb画面の例で説明します。
まず、①、⑦部のFront側のI/Fを説明し、次に、Back End部での ⑤のDB操作を説明します。
CGJS JavaScriptのI/Fや拡張関数の詳細はリファレンスを参照してください。
処理の流れ
1.検索データを取得する例
検索・一覧画面で検索条件が入力され、検索ボタンが押下されたイベントの場合、検索条件をBack Endに渡して、
検索結果を取得するFront部の処理は以下のようになります。
■ FrontのJavaScript(Ajaxで同期処理をする場合)
 function on_search_click() {  // 検索ボタンの押下イベントの処理
 let params = {  // Back Endに渡すパラメータ群
  "cond1": $('#form1').val(),  // 検索条件FORMの値を設定
  "cond2": $('#form2').val(),  // 検索条件FORMの値を設定
  "include": "search_result.js",  // 実行に必要なBack End のモジュールを指定
  "execute": "get_result(cond1, cond2);",  // Back Endで実行する処理のTOP関数
 }
 let result = { };  // 検索結果を受け取るObject
 let message = CGJS.cgjs_if(result, params); // 同期処理は第一引数に結果を受け取るObjectを指定
 if (message != "") {  // Ajax通信のエラー判定、CGI終了後にここに戻る。
  alert(message);
  return false;
 }
// result.CGI_CODE にCGIの終了コード(0:正常終了)が設定されている。
// result.CGI_MESSAGE にCGIのエラーメッセージが設定されている。
// result.CGI_OBJ にCGIからFrontに送信したデータ(検索結果、件数等)が設定されている。
// この位置でresult.CGI_OBJ.Arrを画面に一覧表示する。
 return true;
 }
9行目の CGJS.cgjs_if() がBack EndでのCGIを起動するI/F関数です。
9行目 CGJS.cgjs_if の第一引数にHashを渡せば、CGJS.cgjs_if 関数が終了するとHashに結果が設定されています。
Ajaxで、同期/非同期での処理方法や、引数の詳細は「リファレンス --> CGIの起動、I/F」を参照してください。
■ Back EndのJavaScript(search_result.js)
 function get_result(cond1, cond2) {  // Back Endでの処理を開始する関数
 let sql = "select a, b, c from tbl where key1 = :cond1 and key2 = :cond2";  // SQLを準備
 let conn = null;
 try {
  conn = openDb('oracle',  // データべースに接続
   '/opt/oracle/libclntsh.so',
   'db=ORA;user=test;pwd=test');
  let count = selectToFront(conn, 'Arr', sql);  // 検索結果(配列の配列)を'Arr'のキー名称でFrontに転送
  sendToFront('row_count', count);  // 検索レコード数を'row_count'のキー名称でFrontに転送
 } catch (ex) { console.log(”Exception:" + ex); }
 finally {
  if (conn) {
   closeDb(conn);  // データベースのセッションを終了
  }
 }
 }
8行目 selectToFront 関数で検索結果レコード(配列)の配列を'Arr'のキー名称でFrontに転送する。
9行目 sendToFront 関数で検索結果のレコード数を'row_count'のキー名称でFrontに転送する。
Front部では、result.CGI_OBJ.Arr や result.CGI_OBJ.row_count として参照されます。
2.データを登録する例
Web画面に表形式でデータベースのデータが入力され、登録・更新ボタンが押下されたイベントの場合、
データを渡して登録・更新するFront部の処理は以下のようになります。
■ Front部のJavaScript
 function on_regist_click() { // 登録・更新ボタンの押下イベントの処理
 let reg_data = [ [a1, b1, c1], [a2, b2, c2], ・・・ ]; // 表形式のデータを配列の配列にする
 let params = { // Back Endに渡すパラメータ
   "date": reg_data, // DBに登録するデータ
   "include": "regist_data.js", // 実行に必要なBack End のモジュールを指定
   "execute": "regist_data(date);", // Back Endで実行する処理のTOP関数
 }
 let result = { }; // 検索結果を受け取るObject
 let message = CGJS.cgjs_if(result, params);
 if (message != "") { // Ajax通信のエラー判定
  alert(message);
  return false;
 }
// result.CGI_CODE にCGIの終了コード(0:正常終了)が設定されている。
// result.CGI_MESSAGE にCGIのエラーメッセージが設定されている。
// result.CGI_OBJ にCGIからFrontに送信したデータが設定されている。
 return true;
 }
2行目で登録するレコード群を配列の配列に設定し、9行目でI/F関数によりBack Endの登録処理に渡します。
■ Back EndのJavaScript(regist_data.js)
 function regist_data(data) {  // Back Endでの処理を開始する関数
 let sql = "insert into tbl (a, b, c) values (:1, :2, :3)";  // SQLを準備
 let conn = null;
 try {
  let conn = openDb('sqlserver',  // データべースに接続
   '/opt/microsoft/libmsodbcsql-17.9.so',
   'Driver={SQL Server ...};Server={tcp:127.0.0.1,1433};UID=SA;PWD=pw;Database=db');
  let count = execute(conn, sql, data);  // 配列のデータをBindして、レコード数分登録を繰り返す
  sendToFront('row_count', count);  // 登録レコード数を'row_count'のキー名称でFrontに転送
  execute(conn, 'commit');  // DBの更新を commit する
 } catch (ex) { console.log(ex); }
 finally {
  if (conn) {
   closeDb(conn, 'rollback');  // データべースとの接続終了
  }
 }
 }
Back Endでは、渡されたレコードのデータ群を、SQLのBIND PARAMETERに対応する値を設定し、レコード数分
登録を繰り返します。
SQL内のBIND PARAMETERに値を設定する方法は次の3種類あります。(「リファレンス --> SQL文のBIND」ページを参照)
① :1、:2の形式で、配列内の順番で値を指定する。(順番は1から開始)
② :var_name の形式で、現在のScope内の変数名で値を指定する。
③ :{func1(a,b,c)} や :{x+y} 等 :{式} の形式で、現在のScope内で式を評価して値を指定する。
一般的に、SQLで更新を繰り返す時、レコード値のBIND形式は:1,:2,:3で、レコード群で共通の値や、固定の値の場合
:var_name等を使用します。
3.データベースのパッケージ、設定について
  現在、データベースのI/FはOracle、SqlServer、DB2、PostgreSql、Sqliteについて準備してます。
今後、他のDB、NoSQL等にも対応する予定です。
CGJSのCGIは各データベースごとのCGIと、準備できてるデータベースをまとめたCGI(MultiDb)を準備しています。
配布する.gzipファイルや.zipファイルには、データベース接続のダイナミックリンクライブラリは含まれていません。
「インストール」のページを参考にして、ライブラリを準備してください。
Windows/Linux、本番用/開発用のそれぞれのCGIファイル名は以下の通りです。
  Linux Windows
本番用 CGJS.cgi CGJS.exe
開発用 debugCGJS.cgi debugCGJS.exe
  実際に使用するCGIは、cgjs.jsファイルの先頭部で指定してください。(リファレンスのページを参照)
CGI名称が共通なので、対応するデータベースを調べる時は、コマンドラインで "CGJS.cgi -d" を入力すれば、
対応するデータベースのパッケージ名を表示します。
CGIでは最大15個までのデータベース接続Objectが作成でき、データベースをまとめたCGI(MultiDb)は、openDbの引数指定で
準備している各データベースに接続できます。
CGJSの拡張関数 openDb で各データベースに接続する例は以下の通りです。
// Oracle
var conn = openDb('oracle',
          '/opt/oracle/libclntsh.so',
          'db=XE;user=test;pwd=test');
// SqlServer
var conn = openDb('sqlserver',
          '/opt/microsoft/libmsodbcsql-17.9.so',
          `Driver={SQL Server Native Client 11.0};Server={tcp:127.0.0.1,1433};
           AutoTranslate=no;UID=SA;PWD=test;Database=test
`);
// DB2
var conn = openDb('db2',
          '/opt/ibm/db2/libdb2.so',
          `odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=127.0.0.1;PORT=50000;
           DATABASE=DB2;PROTOCOL=TCPIP;UID=test;PWD=test;
`);
// PostgreSql
var conn = openDb('postgresql',
          '/usr/lib/libpq.so',
          'host=127.0.0.1;port=5432;db=test;user=test;pwd=test');
// Sqlite
var conn = openDb('sqlite',
          '/usr/lib/libsqlite3.so',
          '/home/sqlite.db');
  データベースへの接続には、データベース名、接続ドライバ、接続文字列の3つのパラメータが必要です。
実際にはBack EndのJavaScriptのファイル群に各パラメータを記述するのでななく、CGJS.config ファイルに
プロジェクト共通の変数として一ヶ所で定義します。