#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が使用する更新項目

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 nouka_Insert(int no)
{
	static char DBbuff[MAX_STR];
	int i = 0;
	char *qs;
	int qcount;
	char *poststr;	//POSTメソッド用のポインタ
	char *ps;
	int len;
	int n;
	char *env1,*env2;

	DBConnect();

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

	EXEC SQL BEGIN DECLARE SECTION;
		int rec_count;
		int rec_max;
		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;


	if((qs = getenv("REQUEST_METHOD")) != (char *)NULL)
	{
		if(!strcmp(qs,"GET"))
		{
			if((qs = getenv("QUERY_STRING")) != (char *)NULL)
			{
			//	デバッグの場合必要に応じて以下の関数をコメントを外して使用して下さい。
				len = strlen(qs);
				qcount = query_postHTML(qs,'&',len);
			//	qcount = query_getHTML(qs,'&');
				sf_tbegin();
				for(i=0;i < qcount;i++)
				{
					if(strlen(decodeUTF(qt.get[i])) > tp->len)
					{
						//文字の数がtp->len(定義したTEXT_BOXのカラム長)を超えた場合（例えば備考やメモのカラムの場合２００～２０４８桁の場合））
						len = strlen(decodeUTF(qt.get[i]));
						strncpy(key[i],decodeUTF(qt.get[i]),len);
					}
					else
					{
						sprintf(key[i],"%s",decodeUTF(qt.get[i]));
					}
					sf_tnext();
				}
			}
		}
		else if(!strcmp(qs,"POST"))
		{
			if((ps = getenv("CONTENT_LENGTH")) != (char *)NULL)
			{
				len = atoi(ps);
				poststr = malloc(len+1);
				n = fread(poststr,1,len,stdin);
				qcount = query_postHTML(poststr,'&',len);
			//	qcount = query_getHTML(poststr,'&');
				sf_tbegin();
				for(i=0;i < qcount;i++)
				{
					if(strlen(decodeUTF(qt.get[i])) > tp->len)
					{
						//文字の数がtp->len(定義したTEXT_BOXのカラム長)を超えた場合（例えば備考やメモのカラムの場合２００～２０４８桁の場合））
						len = strlen(decodeUTF(qt.get[i]));
						strncpy(key[i],decodeUTF(qt.get[i]),len);
					}
					else
					{
						sprintf(key[i],"%s",decodeUTF(qt.get[i]));
					}
					sf_tnext();
				}
			}
		}
	}
	else
	{
		sprintf(key[0],"NONE");
		printf("%s<br>\n",key[0]);
	}

	for(i=0;i<qcount;i++)
		sprintf(KEY[i],"%s",key[i]);
	sf_tgetDBallHTML(0);


	// 以下の項目はユニークな項目を利用してインサート時の項目番号等を増加するために利用します
	// 利用する場合はコメントを外して下さい。
	// ユニークな項目の最大数を取得
//	EXEC SQL 
//	SELECT 
//	COUNT(*)
//	INTO :rec_count
//	FROM	nouka
//	WHERE seisansyaCD= :key[1];

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

	// あるDB項目の最大数を取得
//	if(rec_count == 0)
//	{
//		sprintf(seisansyaCD,"%s",key[1]);
//		rec_max = 0;
//	}
//	else
//	{
//		EXEC SQL 
//		SELECT 
//		MAX(No)
//		INTO :rec_max
//		FROM	nouka;

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

	// インサート
	// テーブル項目をsplitbDBbuff[]からDB配列にセットする
	sf_assputDB(no,0,DBbuff,5 + 1);
	johoID = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,1,seisansyaCD,8 + 1);
	sf_assputDB(no,2,seisansyamei,128 + 1);
	sf_assputDB(no,3,furigana,156 + 1);
	sf_assputDB(no,4,yubin,7 + 1);
	sf_assputDB(no,5,todoufuken,20 + 1);
	sf_assputDB(no,6,jusho1,64 + 1);
	sf_assputDB(no,7,jusho2,64 + 1);
	sf_assputDB(no,8,TEL,13 + 1);
	sf_assputDB(no,9,FAX,13 + 1);
	sf_assputDB(no,10,keitaiTEL,13 + 1);
	sf_assputDB(no,11,buraku,32 + 1);
	sf_assputDB(no,12,bikou,1024 + 1);

	// 以下の項目はユニークな項目を利用してインサート時の項目番号等を増加するために利用します
	// 利用する場合はコメントを外して下さい。
//	No = rec_max+1;

	// 対象レコードをADD
	EXEC SQL INSERT INTO nouka
	(
		johoID,
		seisansyaCD,
		seisansyamei,
		furigana,
		yubin,
		todoufuken,
		jusho1,
		jusho2,
		TEL,
		FAX,
		keitaiTEL,
		buraku,
		bikou
	)
	VALUES
	(
		: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')
	);

	// 登録エラー
	if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		// ロールバック
		env1 = getenv("REMOTE_ADDR");
		env2 = getenv("HTTP_USER_AGENT");
		sprintf(tmp,"%s->INSERTエラー:%d - %s:%s:%s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc,env1,env2);
	//	logmsg(tmp);
		EXEC SQL ROLLBACK WORK;
		EXEC SQL END;
		return(-1);
	}

	// コミット
	EXEC SQL COMMIT;
	EXEC SQL END;

	// 結果チェック
	if (sqlca.sqlcode == 0)
	{
		sprintf(tmp,"%s->INSERT結果チェック:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
	}

	// ユニークな項目の最大数を取得
//	EXEC SQL 
//	SELECT 
//	COUNT(*)
//	INTO :rec_count
//	FROM	nouka_Insert
//	WHERE seisansyaCD= :key[1];

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

	DBcount[no] = rec_count;

	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}

// DBから入出力(画面)ウインドウに書き込みます。
void nouka_Insert_text_writeHTML(int no, int post, int line,int maxcol, char **db_titles)
{
	int i;
	char s[MAX_TMP];

	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>form text_writeHTML page</title>\n");
	printf("</head>\n");
	printf("<body bgcolor=\"#ffffff\">\n");
	printf("<br>\n");
	printf("<a href=\"http://codoo2hk.corede.net/index.html\" target=\"_parent\">[TOPへ]</a>\n");
	printf("<a href=\"#\" onClick=\"history.back(); return false;\">[前に戻る]</a>\n");
	printf("<form method=\"post\" action=\"/cgi-bin/nouka.fcgi?field00=%s&amp;field01=#form%05d\">\n",KEY[1],DBcount[no]-1);
	printf("<input accesskey=\"A\" tabindex=1 type=\"submit\" style=\"float:left\" value=\"INSERTが完了しました。戻ります\">\n");
// 以下は別の _Fetch.fcgi を呼び出す場合の転送文字列を指定します。KEY[]の文字列はユニークが必要です。
	printf("<input accesskey=\"A\" tabindex=1 type=\"hidden\" name=\"field00\" size=\"1\" value=\"%s\" maxlength=\"1\" ><br>\n",KEY[1]);
	printf("</form>\n");
	printf("</body>\n");
	printf("</html>\n");
}

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

	int startline;

	int line;
	setlocale(LC_ALL,"");

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

	static int xcol = 156;
	static int rows = 19;

//for label
	static int label_length[] = {0};
	static int label_no[] = {0};
	static int label_align[] = {0};
	static char *label_text[1][128] = {""};
	static int label_x[] = {0};
	static int label_y[] = {0};

//.def ファイルで画面上で定義不可能な長いカラムは実際のDBのカラム長に合わせてここで変更してください。
//for textbox
	static int textbox_length[] = {8,8,32,48,7,20,62,62,13,13,13,32,138,0};
	static int textbox_no[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,0};
	static int textbox_align[] = {1,2,2,2,2,2,2,2,2,2,2,2,2,0};
	static int textbox_action[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	static int textbox_skipstep[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,0};
	static int textbox_field[] = {2,1,1,1,1,1,1,1,1,1,1,1,1,0};
	static int textbox_x[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	static int textbox_y[] = {4,5,6,7,8,9,10,11,12,13,14,15,16,0};


//for grid
	static int cell_length[] = {5,3,3,3,3,3,3,3,3,3,3,8,15,0};
	static int cell_align[] = {1,2,2,2,2,2,2,2,2,2,2,2,2,0};
	static int cell_action[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	static int grid_field[] = {2,1,1,1,1,1,1,1,1,1,1,1,1,0};
	static int grid_skipstep[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,0};
	char *grid_titles[14][128] = {"Grid_1","Grid_2","Grid_3","Grid_4","Grid_5","Grid_6","Grid_7","Grid_8","Grid_9","Grid_10","Grid_11","Grid_12","Grid_13",""};
	static char *db_titles[14][128] = {"johoID","seisansyaCD","seisansyamei","furigana","yubin","todoufuken","jusho1","jusho2","TEL","FAX","keitaiTEL","buraku","bikou",0};
	static int grid_sx = 0;
	static int grid_ex = 69;
	static int grid_sy = 2;
	static int grid_ey = 2;

	static int maxtext;
	static int no = 0;

	char **gt;
	char **lt;

	gt = (char **)&grid_titles;

	xcol = MakeWsubFormHTML(no,xcol,rows,0,2,grid_sx,grid_sy,grid_ex,grid_ey,cell_length,cell_align,cell_action,grid_field,grid_skipstep,gt,13);

	lt = (char **)&label_text;

//	以下の関数は<SELECT>でコンボボックスを作成する場合、一つのCGIで重複して利用出来ませんのでどちらかを削除してください。
	maxtext = MakeTextBoxHTML(no,0,2,xcol,rows,label_no,lt,label_x,label_y,label_length,textbox_no,textbox_x,textbox_y,textbox_length,textbox_align,textbox_action,textbox_field,textbox_skipstep, 13);

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


	if(nouka_Insert(0) != -1)
	{
		nouka_Insert_text_writeHTML(no,0,0,maxtext,*db_titles);
	}
	else
	{
		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-INSERT-ERROR</title>\n");
		printf("</head>\n");
		printf("<body bgcolor=\"#ffffff\">\n");
		printf("<br>\n");
		printf("<table border=0>\n");
		printf("<tr>\n");
		printf("INSERTが失敗しました。<br>\n");
		printf("</tr>\n");
		printf("</body>\n");
		printf("</html>\n");
	}
}

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

