as_DBMOpenSearchScanTable

Description
특정 테이블에서 특정 문자열을 포함하거나, 특정 숫자를 가진 레코드를 읽기 위한 스캔을 초기화한다.

Syntax
DBMErr as_DBMOpenSearchScanTable(TableId tableId, SearchFlag searchFlag, FieldData *searchData, ScanId* scanId);

Parameters
tableId 테이블의 ID
searchFlag DBM_ALL_FIELD : 모든 필드 search
(BLOB을 제외한 필드들 중에 찾고자 하는 데이타와 같은 타입의 필드에 대해서만 검색 수행)
DBM_ONE_FIELD : 특정 필드만 search
searchData 찾고자 하는 패턴에 대한 정보
문자열인 경우, 최대 길이는 PATTERN_LEN
scanIdopen된 스캔 ID

Returns
value설명
DBM_OK성공적으로 수행된 경우
DBM_TOO_MANY_SCANS이미 open된 스캔의 수가 NUM_SCANS인 경우
DBM_INVALID_TABLE_ID주어진 테이블 id를 갖는 테이블이 존재하지 않는 경우
DBM_INVALID_FLAGsearchFlag,가 DBM_ALL_FIELD도 DBM_ONE_FIELD도 아닌 경우
DBM_INVALID_SEARCH_DATA 해당 필드 id가 테이블 스키마에 존재하지 않는 경우,
필드의 데이타 타입이 테이블 스키마와 일치하지 않는 경우,
BLOB 필드를 search 필드로 지정한 경우
pattern의 길이가 PATTERN_LEN보다 큰 경우
DBM_DB_NOT_INITED데이타베이스가 초기화되어 있지 않은 경우

Comments
찾고자 하는 패턴이 문자열인 경우에는 substring match되는 레코드를 검색하고, 숫자값을 찾는 경우에는 exact match되는 레코드를 검색한다.

매개변수에서 사용되는 searchData의 자료구조는 다음과 같다.
typedef struct {
  FieldIdid;/* 모든 필드에 대한 검색일 경우에는 사용하지 않는다 */
  FieldDataType  type;
  S32 len;/* 문자열을 찾고자 할 때 사용한다. */
  union {/* 찾고자 하는 문자열이나 숫자값. */
  S16int2val;
  S32int4val;
  P_S8 str; /* 끝에 '\0'이 있어야 한다 */
  }content;
} FieldData;

스캔을 open한 이후, 최초로 호출되는 as_DBMGetNextRecordId 또는 as_DBMGetPrevRecordId는 주어진 searchData를 포함하는 처음 레코드 ID를 반환한다.

See Also
as_DBMOpenSearchScanCategory, as_DBMGetNextRecordId, as_DBMGetPrevRecordId

Example
TableId tableId; ScanId scanId;
RecId recId; DBMErr ret=DBM_OK;
int numFields, numExistFields; FieldDataInfo fieldDataInfo;
FieldData keyData, fieldData;
SearchFlag searchFlag = DBM_ONE_FILED;

// Get tableId, catId
// assign the search data for the primary index field
searchData.id=0;
searchData.type=DBM_STRING;

searchData.content.str = Lmalloc( strlen("keyString") + 1);
strcpy(searchData.content.str, "searchString" );
ret=as_DBMOpenSearchScanTable( tableId, searchFlag, searchData, &scanId);
if( ret < DBM_OK ) // error handling
numFields = NUM_FIELDS;
...
/* allocate space for fieldDataInfo */
fieldDataInfo =(FieldDataInfo*)Lmalloc( sizeof(FieldDataInfo) * numFields );
while( (ret = as_DBMGetNextRecordId( scanId, &recId, &numExistFields,
   fieldDataInfo) >= DBM_OK ) {
   ...
}