#include "wsubformHTML.h"	//サブフォーム専用ヘッダファイルをインクルードする。

extern char gridtitles[MAX_POS][MAX_LEN];	//wsubformHTMLが利用するgridのタイトル。

extern TextBox	 *begin;	//textboxで使用する連鎖ポインタの開始位置
extern TextBox	 *tp;	//textboxで使用する連鎖ポインタ

typedef struct stat Dir;	//ファイル操作用
static Dir dirptr;
static Dir  *fptr = &dirptr;

char tmp[MAX_STR];
char COMMANDNAME[256];	//実行するCGI自身の名前
static int sqlcode = 0;	//PostgreSQLの返すコード

int DBcount[MAX_FORM];	//wsubformHTMLで利用するDBの現在の最大行数
extern char KEY[256][MAX_STR];	//INSERTとUPDATEが使用する更新項目
extern int IKEY[256];	//INSERTとUPDATEが使用する更新項目(数値用)

int DBConnect(void)
{
	// DB接続用変数宣言です。DB名、ユーザ名、パスワードを設定してください。
	EXEC SQL BEGIN DECLARE SECTION;
		char dbname[12];
		char user[12];
		char passwd[12];
	EXEC SQL END DECLARE SECTION;

	strcpy(dbname,"apsch");
	strcpy(user,"cms");
	strcpy(passwd,"cms");

#ifdef DEBUG
	// ECPGデバッグ文出力
	ECPGdebug (0, stderr);
#endif

	// 接続
	memset (sqlca.sqlstate, '0', 5);
	EXEC SQL CONNECT TO :dbname AS dbConnection user :user USING :passwd;
	if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"%s->CONNECT エラー。終了します。:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
		exit (EXIT_FAILURE);
	}
}

int Fetch_meishokubun(int no, int line)
{
	static char DBbuff[MAX_STR];
	int i = 0;

	DBConnect();

	memset (sqlca.sqlstate, '0', 5);

	EXEC SQL BEGIN DECLARE SECTION;
		int rec_count;
		char key[256][MAX_STR];
		int	 ikey[256];
		int		No;		//NUMERIC
		char	meishokubun[2 + 1];	//TEXT
		int		edaban;		//NUMERIC
		char	meisho[90 + 1];	//TEXT
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;
	DBcount[no] = 0;

	rec_count = 0;

	// DBの行数を取得
	EXEC SQL 
	SELECT 
	COUNT(*)
	INTO :rec_count
	FROM	meishokubun;

	// SELECTエラー 
	if(memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"%s->SELECT COUNTエラー:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
		return(-1) ;
	}

	DBcount[no] = rec_count;

	EXEC SQL DECLARE meishokubun_CURSOR CURSOR FOR 
	SELECT 
		No,
		coalesce(meishokubun,' ','0'),
		edaban,
		coalesce(meisho,' ','0')
	FROM	meishokubun
	ORDER BY meishokubun,edaban ASC;

	// カーソルオープン
	EXEC SQL OPEN meishokubun_CURSOR;

	// CURSOR OPENエラー 
	if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"meishokubun.pgc->CURSOR OPENエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		fprintf(stderr,"%s\n",tmp);
		return(-1);
	}

	printf("Content-type: text/html\n\n");
	printf("<html>\n");
	printf("<head>\n");
	printf("<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n"); 
	printf("<title>Wsubform-HTML-DBgrid</title>\n");
	printf("</head>\n");
	printf("<body>\n");
	printf("<table border=1>\n");
	printf("<tr bgcolor=#ffffff>\n");
	for(i=0;i<DBcount[no];i++)
	{
		EXEC SQL FETCH meishokubun_CURSOR INTO
			:No,
			:meishokubun,
			:edaban,
			:meisho;

			//送信はGETを使用します。
		//	printf("<th><form method=\"get\" action=\"/cgi-bin/meishokubun_Menu.cgi\">\n");	//メニュー用
			printf("<form method=\"get\" action=\"/cgi-bin/meishokubun_Fetch.cgi\">\n");
			printf("<td>%d</td>", No);
			printf("<td>%s</td>", meishokubun);
			printf("<td>%d</td>", edaban);
			printf("<td>%s</td>", meisho);
			printf("<td><input type=\"submit\" name=\"field\" value=\"%d\"></td>", No);
			printf("</tr>\n");

		if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
		{
			EXEC SQL CLOSE meishokubun_CURSOR;
			sprintf(tmp,"%s->FETCH完了:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		//	logmsg(tmp);
		}
	}
	printf("</table>\n");
	printf("</body>\n");
	printf("</html>\n\n");
	// カーソルクローズ 
	EXEC SQL CLOSE meishokubun_CURSOR;

	DBcount[no] = rec_count;

	// 結果チェック
	if (sqlca.sqlcode == 0)
	{
		sprintf(tmp,"%ss->FETCH結果チェック:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
	}
	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}


int subformHTML(void)
{
	int i;
	char s[MAX_STR];

	int startline;

	int line;
	setlocale(LC_ALL,"");

//------------------------------------------------------------------------
//下ののハイフンのラインまでの以下の関数はDBと画面の設計を実際のフォームに適用します。
//これらの関数が無い場合は設計情報はDB設計以外は反映されません。

//------------------------------------------------------------------------

	for(i=0;i<MAX_POS;i++)
	{
		memset(gridtitles[i],'\0',MAX_LEN);
	}

	sf_startcell(0);

	startline = 0;	//画面初期行

	Fetch_meishokubun(0,line);	//*標準出力する。

}

int main(int argc, char *argv[])
{
	sprintf(COMMANDNAME,"%s",argv[0]);
	subformHTML();
}

