static    char    sccsid[]="%Z% %M% %I% %E% %U%";
#include "colmn.h"

extern CLPRTBL  *pCLprocTable;
extern GlobalCt *pGlobTable;

static char *gcpRslBody = NULL;

int cl_proc_read(prmnum, prmp, Obj)
int      prmnum;
parmList *prmp[];
int      *Obj;
{
	SearchResult *pSchRsl;		/* 検索結果構造体 */
	ScrPrCT      *pScrPrCT;		/* スクリプト・テーブル */
	tdtInfoParm  rInfoParm,rInfoParm2;	/* パラメータ情報構造体 */
	tdtInfoParm  *pInfoParm;	/* パラメータ情報構造体 */
	int    iTupleNumber;		/* タプル番号 */
	int    iLocation;			/* データ先頭からの位置(バイト数) */
	int    i;					/* ループ・カウンター */
	int    iRc;					/* リターンコード */
	int    iParmLen, *pSize;
	char   *pIndBuff;			/* バッファーのインディケータ */
	char   temp[17],c,*dVarp,*pTemp;
	CnCB   qCnCB;	/* K-00039 */
	long lmsh;

	/*
	*** カレント・スクリプト・テーブルの探索
	 */
	if (!(pScrPrCT = cl_search_src_ct())) {
		ERROROUT("current script table is not found");
		return ECL_SYSTEM_ERROR;
	}

	/* prmpがNULLならエラー */
	if (!prmp) {
		ERROROUT("parameter error");
		return ECL_SYSTEM_ERROR;
	}

	/*
	*** 検索結果データ構造体の探索
	 */
	if (iRc=cl_get_area_id(prmp[0],Obj,&pTemp)) return iRc;

	pSchRsl = pCLprocTable->SearchRsltF;
	while (pSchRsl) {
		if (!strcmp(pSchRsl->sAreaId,pTemp)) break;
		pSchRsl = pSchRsl->Next;
	}
	if(!pSchRsl) {
		ERROROUT(FORMAT(356));	/* 該当するデータ格納エリアIDが存在しない */
		return ECL_SCRIPT_ERROR;
	}

	/*
	*** 検索結果がファイルにある場合は検索結果構造体をセット
	printf("szType = [%s]\n",pSchRsl->szType);
	 */
	if (!strcmp( pSchRsl->szType,"F")) {
		/* 検索結果がファイルにある場合 */
		/* 検索結果構造体をセット */
		if (iRc = cl_set_result(pSchRsl)) {
			ERROROUT("search result set error");
			return iRc;
		}
		/* 格納タイプを"B"(メモリー上のバッファ)にセット */
		strcpy(pSchRsl->szType, "B");
	}
#ifdef MSPACE	/* 2000.6.22 Koba */
	else if (!strcmp(pSchRsl->szType, "M")) {
		if (gcpRslBody) {
			gcpRslBody = Realloc(gcpRslBody,pSchRsl->iDataLen);
		}
		else {
			gcpRslBody = Malloc(pSchRsl->iDataLen);
		}
		if (!gcpRslBody) {
			ERROROUT("malloc error for search result");
			return ECL_SYSTEM_ERROR;
		}
		pSchRsl->RslBody = gcpRslBody;
		lmsh = (long)pSchRsl->pzFileName;
		iRc = akxa_ms_read(lmsh,gcpRslBody,0,pSchRsl->iDataLen);
		if (iRc != pSchRsl->iDataLen) {
			ERROROUT1(" ms_read error for search result rc = %d",iRc);
			return ECL_SYSTEM_ERROR;
		}
	}
#endif
	/*********************
	 * 対象タプルの指定
	 *********************/
	if (prmnum<=1 || prmp[1]==NULL || prmp[1]->prmlen==0) {
		/* タプル番号が省略された場合 */
		if (pSchRsl->iTupleNum <= 0) return ECL_SCRIPT_ERROR;
		/* 1つ前にREADされた次のタプルを対象 : カレントタプル番号をインクリメント */
		iTupleNumber = pSchRsl->iCrTuple + 1;
	}
	else {
		/* タプル番号が指定された場合 */
		/* 引数変換 */
		if (iRc = cl_gx_exp_obj(prmnum-1,&prmp[1],Obj,&rInfoParm)) {
			ERROROUT1(FORMAT(357),iRc);	/* タプル番号の式が誤っています。ret=%d */
			return ECL_EX_READ;
		}
		if (iRc = cl_get_parm_bin(&rInfoParm,&iTupleNumber,FORMAT(358)));	/*タプル番号: */
			return ECL_EX_READ;
		/* タプル番号に0が指定されたときは読み込みは行わない */
		if( iTupleNumber == 0 && pSchRsl->iDataLen <= 0) {
			pSchRsl->iCrTuple = iTupleNumber;
			pGlobTable->tuppl  = pSchRsl->iTupleNum;
			pGlobTable->column = pSchRsl->iColmNum;
			pScrPrCT->Vary->varnam_igeta = 0;
			pSize = (int *)pScrPrCT->Vary->pTBL_igeta[0];
			cl_set_parm_bin(cl_var_size_parm(pSize),0);
			return NORMAL;
		}
	}

	if(iTupleNumber < 0 || iTupleNumber > pSchRsl->iTupleNum) {
		ERROROUT(FORMAT(359));	/* タプル番号が範囲外です。 */
		return ECL_EX_READ;
	}

	pGlobTable->tuppl  = pSchRsl->iTupleNum;
	pGlobTable->column = pSchRsl->iColmNum;

	/* カレントタプル番号を更新  */
	pSchRsl->iCrTuple = iTupleNumber;

	/*
	*** 検索結果データの位置の取得
	 */
	/* タプル番号に該当する検索結果データの，先頭からの位置を取得 */
	iLocation = 0;
	if (iTupleNumber > 0)
		iLocation = (int)(*((pSchRsl->iIndex)+(iTupleNumber-1)));
	/*
	*** 検索結果読み込み変数のセット
	 */
	pSize = (int *)pScrPrCT->Vary->pTBL_igeta[0];
	if ((pScrPrCT->Vary->varnam_igeta = pSchRsl->iColmNum)>pSize[2])
		pScrPrCT->Vary->varnam_igeta = pSize[2];
	cl_set_parm_bin(cl_var_size_parm(pSize),pScrPrCT->Vary->varnam_igeta);

	/* カラム数分ループ */
	/* バッファー・インディケータに該当タプルの最初のカラムの先頭をセット */
	pIndBuff = (char *)pSchRsl->RslBody + iLocation;
	for (i = 1; i <= pScrPrCT->Vary->varnam_igeta; i++) {
		pInfoParm = cl_get_var_ent(pScrPrCT->Vary->pTBL_igeta,i);
		/* 検索結果データの取得 */
		cmn_chk_data(pIndBuff, &rInfoParm);
		iParmLen = rInfoParm.pi_len;
		iRc = cl_code_trans(&rInfoParm,&rInfoParm2);
		if (iRc<0) {
			ERROROUT("cl_process_read:CodeTrans error.");
			return ECL_EX_READ;
		}
		else if (iRc) {
			cl_gx_rep_info_set_ign(pInfoParm ,&rInfoParm2 ,0);
		}
		else {
			cl_gx_rep_info_set_ign(pInfoParm ,&rInfoParm ,1);
		}
		pInfoParm->pi_aux[1] |= D_AUX1_PROTECTED;
DEBUGOUT_InfoParm(190,"cl_process_read:i=%d",pInfoParm,i,0);
		/* バッファー・インディケータに次のカラムの先頭をセット */
		pIndBuff = (char *)pIndBuff + iParmLen;
	}

	return( NORMAL );
}

int cl_get_area_id(prmp,Obj,temp)
parmList *prmp;
int      *Obj;
char **temp;
{
	tdtInfoParm rInfoParm;
	char *p;
	int iRc;

	p = FORMAT(360);	/* データ格納エリアID */
	if (!temp) iRc = -1;
	else if (prmp==NULL || prmp->prmlen==0) {
		/* データ格納エリアIDが省略されている場合 */
		*temp = cl_tmp_const_malloc(strlen(RSLTFILE)+1);
		strcpy(*temp,RSLTFILE);
		iRc = 0;
	}
	else if (iRc = cl_arg_to_char(prmp,Obj,&rInfoParm,p)) ;
	else {
		if (rInfoParm.pi_dlen != AREA_ID_SIZE) {
			/* W: %s[%s] 長さ(%d) */
			ERROROUT3(FORMAT(361),p,rInfoParm.pi_data,rInfoParm.pi_dlen);
		}
		if (iRc = cl_chk_name(rInfoParm.pi_data, rInfoParm.pi_dlen)) {
			/* %s[%s] \x8d\\成文字 error */	/* 構 */
			ERROROUT2(FORMAT(362),p,rInfoParm.pi_data);
			iRc = ECL_SCRIPT_ERROR;
		}
		else {
			*temp = cl_tmp_const_malloc(rInfoParm.pi_dlen+1);
			memzcpy(*temp,rInfoParm.pi_data,rInfoParm.pi_dlen);
		}
	}
	return iRc;
}
