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

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,"apsch2");
	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_nouka(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		johoID;		//NUMERIC
		char	seisansyaCD[8 + 1];	//TEXT
		char	seisansyamei[128 + 1];	//TEXT
		char	furigana[156 + 1];	//TEXT
		char	yubin[7 + 1];	//TEXT
		char	todoufuken[20 + 1];	//TEXT
		char	jusho1[64 + 1];	//TEXT
		char	jusho2[64 + 1];	//TEXT
		char	TEL[13 + 1];	//TEXT
		char	FAX[13 + 1];	//TEXT
		char	keitaiTEL[13 + 1];	//TEXT
		char	buraku[32 + 1];	//TEXT
		char	bikou[1024 + 1];	//TEXT
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;
	DBcount[no] = 0;

	rec_count = 0;

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

	// 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) ;
	}

	if(rec_count == 0)
	{
		printf("Content-type: text/html; charset=utf-8\n\n");
		printf("<html lang=\"ja\">\n");
		printf("<head>\n");
		printf("<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n"); 
		printf("<title>DB-ERROR</title>\n");
		printf("</head>\n");
		printf("<body bgcolor=\"#ffffff\">\n");
		printf("<br>\n");
		printf("<table border=0>\n");
		printf("<tr>\n");
		printf("みつかりませんでした。<br>\n");
		printf("<form name=\"error\" method=\"post\" action=\"/cgi-bin/nouka.fcgi\">\n");
		printf("<input accesskey=\"A\" tabindex=0 type=\"submit\" value=\"戻る\">\n");
		printf("</form>\n");
		printf("</tr>\n");
		printf("</body>\n");
		printf("</html>\n");
	}

	DBcount[no] = rec_count;

	EXEC SQL DECLARE nouka_CURSOR CURSOR FOR 
	SELECT 
		johoID,
		coalesce(seisansyaCD,' ','0'),
		coalesce(seisansyamei,' ','0'),
		coalesce(furigana,' ','0'),
		coalesce(yubin,' ','0'),
		coalesce(todoufuken,' ','0'),
		coalesce(jusho1,' ','0'),
		coalesce(jusho2,' ','0'),
		coalesce(TEL,' ','0'),
		coalesce(FAX,' ','0'),
		coalesce(keitaiTEL,' ','0'),
		coalesce(buraku,' ','0'),
		coalesce(bikou,' ','0')
	FROM	nouka
	ORDER BY seisansyaCD;

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

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

	printf("Content-type: text/html; charset=utf-8\n\n");
	printf("<html lang=\"ja\">\n");
	printf("<head>\n");
	printf("<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n"); 
		printf("<link rel=\"stylesheet\" href=\"/nouka.css\" type=\"text/css\">\n");
	printf("<title>Wsubform-HTML-DBgrid</title>\n");
	printf("</head>\n");
	printf("<body bgcolor=\"#ffffff\">\n");
	printf("<table class=\"nouka\" border=2>\n");
	printf("<tr>\n");
	for(i=0;i<DBcount[no];i++)
	{
		EXEC SQL FETCH nouka_CURSOR INTO
			:johoID,
			:seisansyaCD,
			:seisansyamei,
			:furigana,
			:yubin,
			:todoufuken,
			:jusho1,
			:jusho2,
			:TEL,
			:FAX,
			:keitaiTEL,
			:buraku,
			:bikou;

			//送信はGETを使用します。
		//	printf("<form method=\"get\" action=\"/cgi-bin/nouka_Menu.fcgi\">\n");	//メニュー用
			printf("<form method=\"get\" action=\"/cgi-bin/nouka/nouka_Fetch.fcgi\">\n");
			printf("<td class=\"nouka\">%d</td>", johoID);
			printf("<td class=\"nouka\">%s</td>", seisansyaCD);
			printf("<td class=\"nouka\">%s</td>", seisansyamei);
			printf("<td class=\"nouka\">%s</td>", furigana);
			printf("<td class=\"nouka\">%s</td>", yubin);
			printf("<td class=\"nouka\">%s</td>", todoufuken);
			printf("<td class=\"nouka\">%s</td>", jusho1);
			printf("<td class=\"nouka\">%s</td>", jusho2);
			printf("<td class=\"nouka\">%s</td>", TEL);
			printf("<td class=\"nouka\">%s</td>", FAX);
			printf("<td class=\"nouka\">%s</td>", keitaiTEL);
			printf("<td class=\"nouka\">%s</td>", buraku);
			printf("<td class=\"nouka\">%s</td>", bikou);
			printf("<td><input type=\"submit\" name=\"field\" value=\"%s\"></td>", seisansyaCD);
			printf("</tr>\n");

		if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
		{
			EXEC SQL CLOSE nouka_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 nouka_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_nouka(0,line);	//*標準出力する。

}

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

