/**
* Copyright(c) 2011 Sunmedia Technologies - All Rights Reserved.
*
* @file al_database.h
*
* The common interface to manipulate database record.
*
* @brief Gives the functionalities for quering as well as manipulating
* 		the database record.
*
* @note .
*/

#ifndef __AL_DATABASE_DBMERGE_H__
#define __AL_DATABASE_DBMERGE_H__

#include "al_basictypes.h"
#include "cdbi.h"
#include "db_lcn.h"

#ifdef __cplusplus
	extern "C"{
#endif
/****************************************************
 * Macros definition
 ****************************************************//**
 * @addtogroup MacrosDef Macros definition
 * @{
 ********************************************************/
 /**
 * @brief Macros of invalid record handle
 *
 */
 #define AL_DB_INVALIDHDL CDBI_INVALID_HDL

/**
* @brief Get offset of detail field
*/
#define FIELD_OFFSET(type, field) ((al_long)&(((type *)0)->field))
#define FIELD_SIZEOF(type, field) (sizeof(((type *)0)->field))

/****************************************************
 * Enumeration definition
 ****************************************************//**
 * @}
 * @addtogroup EnumDef Enumeration definition
 * @{
 ********************************************************/
/**
* @brief Enumeration of all the supported database type
*
*/
typedef enum
{
	AL_DBTYPE_DVB_ATV = CDBI_DBTYPE_DVB_ATV,	/**< Analog channel database */
	AL_DBTYPE_DVB_T = CDBI_DBTYPE_DVB_T,		/**< DVB Terrestrial channel database */
	AL_DBTYPE_DVB_C = CDBI_DBTYPE_DVB_C,		/**< DVB Cable channel database */
	AL_DBTYPE_DVB_S = CDBI_DBTYPE_DVB_S,		/**< DVB Satellite channel database */
#ifdef CONFIG_ISDB_SYSTEM
	AL_DBTYPE_DVB_SBTVD = CDBI_DBTYPE_DVB_SBTVD,
#endif
	AL_DBTYPE_ATSC = CDBI_DBTYPE_ATSC_NTSC,		/**< DVB Satellite channel database */
	AL_DBTYPE_DVB_DTVALL = (AL_DBTYPE_DVB_T
							| AL_DBTYPE_DVB_C
							| AL_DBTYPE_DVB_S
						#ifdef CONFIG_ISDB_SYSTEM
							| AL_DBTYPE_DVB_SBTVD
						#endif
							),
	AL_DBTYPE_MAX,
} AL_DB_EDBType_t;

/**
* @brief Enumeration of all the supported record type
*
*/
typedef enum
{
	AL_RECTYPE_DVBTV = CDBI_RECTYPE_DVBTV,				/**< DVB TV record*/
	AL_RECTYPE_DVBRADIO = CDBI_RECTYPE_DVBRADIO,			/**< DVB Radio record*/
	AL_RECTYPE_DVBDATA = CDBI_RECTYPE_DVBDATA,			/**< DVB Data service record*/
	AL_RECTYPE_DVBSERVICE = CDBI_RECTYPE_DVBSERVICE,		/**< DVB TV or Radio or data record*/
	AL_RECTYPE_DVBNETWORK = CDBI_RECTYPE_DVBNETWORK	,	/**< DVB Network record*/
	AL_RECTYPE_DVBMULTIPLEX = CDBI_RECTYPE_DVBMULTIPLEX,	/**< DVB Mulitplex record*/
	AL_RECTYPE_ATVSERVICE = CDBI_RECTYPE_ATVSERVICE,		/**< ATV channel record*/

	AL_RECTYPE_MAX,
} AL_DB_ERecordType_t;

/**
* @brief Enumeration of record operation request type.<br>
* <b>Used in: </b>#AL_DB_GetRecord().
*/
typedef enum
{
	AL_DB_REQ_GETFIRST,	/**< Getting first record handle, no need referenced handle.*/
	AL_DB_REQ_GETLAST,	/**< Getting last record handle, no need referenced handle.*/
	AL_DB_REQ_GETNEXT,	/**< Getting the next record handle of referenced handle.*/
	AL_DB_REQ_GETPREV,	/**< Getting the previous record handle of referenced handle.*/

	AL_DB_REQ_GETPARENT,	/**< Getting the parent record handle of referenced handle.*/
} AL_DB_ERecordRequest_t;

/**
* @brief Enumeration of record move operation type.<br>
* <b>Used in: </b>#AL_DB_MoveRecord().
*/
typedef enum
{
	/**
	* Move current record to the first place in its database, others go backward one by one.<br>
	* <b>No need referenced record.</b>
	*/
	AL_DB_MV_FIRST,
	/**
	* Move current record to the last place in its database, others go forward one by one.<br>
	* <b>No need referenced record.</b>
	*/
	AL_DB_MV_LAST,
	/**
	* Move current record to the front of the referenced service:
	* @li if current record locates front of the referenced service, others between them go forward one by one;
	* @li if current record locates behind of the referenced service, others between them go backward one by one.
	*/
	AL_DB_MV_FRONT,
	/**
	* Move current record to the behind of the referenced service:
	* @li if current record locates front of the referenced service, others between them go forward one by one;
	* @li if current record locates behind of the referenced service, others between them go backward one by one.
	*/
	AL_DB_MV_BEHIND,
	/**Swap current record and refereced record.*/
	AL_DB_MV_SWAP,
} AL_DB_EMoveType_t;

/**
* @brief Enumeration of record sort operation type.<br>
* <b>Used Funcs: </b>#AL_DB_SortRecords().
*/
typedef enum
{
	AL_DB_SORTBY_NONE,		/**< No sort.*/
	AL_DB_SORTBY_NO,		/**< Sort by program number.*/
	AL_DB_SORTBY_TYPE_INNER_NO, /**< Sort by program number within a service type. */
	AL_DB_SORTBY_NAME,		/**< Sort by program name.*/
	AL_DB_SORTBY_ID,		/**< Sort by service ID.*/
	AL_DB_SORTBY_FREQ_INNER_NAME,		/**< Sort by frequency.*/
	AL_DB_SORTBY_FREQ,		/**< Sort by frequency(if rec is service, all services within one freq will be list with its position in SDT).*/
	AL_DB_SORTBY_FREQ_OCA,	/**< same with AL_DB_SORTBY_FREQ, and put the duplicate service to the list tail also.*/
	AL_DB_SORTBY_SERVTYPE,	/**< Sort by service type.*/
	AL_DB_SORTBY_USER,		/**< Sort by user defined method.*/

	AL_DB_SORT_ALL,
} AL_DB_ESortType_t;

/** Tune type define */
typedef enum
{
	AL_DB_MANUAL_SEARCH,
	AL_DB_AUTO_SEARCH,
} AL_DBTuneType_t;

/**< DVB private spec type define */
typedef enum
{
	AL_DB_DVB_PRISPEC_DBOOK = 0,		/**< for UK, except ireland  */
	AL_DB_DVB_PRISPEC_ZBOOK,			/**< Italy  */
	AL_DB_DVB_PRISPEC_AUS, 		/**< Australia	*/
	AL_DB_DVB_PRISPEC_NORDIG,		/**< Nordig  */
	AL_DB_DVB_PRISPEC_EBOOK,			/**< pan Europe */
	AL_DB_DVB_PRISPEC_SBTVD,			/**< Brazil */
	AL_DB_DVB_PRISPEC_OCA, 		/**< (Spain)Engel OCA need to save all Dupli service */
} AL_DBPrivateSpec_t;

/****************************************************
 * Structure definition
 ****************************************************//**
 * @}
 * @addtogroup StructDef Structure definition
 * @{
 ********************************************************/
/**
* @brief Structure of record handle
*/
typedef CDBIHandle_t AL_RecHandle_t;

/**
* @brief Structure of record handle
*/
typedef CDBICapability_t AL_DBCapability_t;

/**
* @brief Union of service detail.
*/
typedef  union
{

	SADBServInfo_t stAnalogServ;
	STDBServInfo_t stDVBTServ;
	SCDBServInfo_t stDVBCServ;
	SDBServInfo_t stDVBSServ;
#ifdef CONFIG_ISDB_SYSTEM
	SSBTVDDBServInfo_t stSBTVDServ;
#endif
} AL_ServiceDetail_t;

/**
* @brief Union of multiplex detail.
*/
typedef  union
{
	STDBMultiplexInfo_t stDVBTMultiplex;
	SCDBMultiplexInfo_t stDVBCMultiplex;
	SDBMultiplexInfo_t stDVBSMultiplex;
#ifdef CONFIG_ISDB_SYSTEM
	SSBTVDDBMultiplexInfo_t stSBTVDMultiplex;
#endif
} AL_MultiplexDetail_t;

/**
* @brief Union of network detail.
*/
typedef  union
{
	STDBNetworkInfo_t stDVBTNetwork;
	SCDBNetworkInfo_t stDVBCNetwork;
	SDBNetworkInfo_t stDVBSNetwork;
#ifdef CONFIG_ISDB_SYSTEM
	SSBTVDDBNetworkInfo_t stSBTVDNetwork;
#endif
} AL_NetworkDetail_t;

/**
* @brief Union record detail.
*/
typedef union
{
	AL_ServiceDetail_t stServInfo;
	AL_MultiplexDetail_t stTPInfo;
	AL_NetworkDetail_t stNetInfo;
} AL_RecordDetail_t;

/**
* @brief User defined reset function to set default value after reset, refers to the usage of its prototype.
*/
typedef CDBISetRec2DefVal_t AL_DB_ResetDefValFunc;

/**
* @brief User defined match function, refers to the usage of its prototype.
*/
typedef fpCDBIRecMatch AL_DB_RecordMatchFunc;

/**
* @brief User defined record compare function, refers to the usage of its prototype.
*/
typedef fpCDBIRecUserCmp AL_DB_RecordUserCmp;

/**
* @brief User defined group of match function for upper layer
*/
typedef struct
{
	AL_DB_RecordMatchFunc pNetMatch;		/**< Network Match function callback */
	AL_DB_RecordMatchFunc pMulitplexMatch;	/**< Multiplex Match function callback */
	AL_DB_RecordMatchFunc pServMatch;		/**< Service Match function callback */
} AL_DB_RecDupliChkFunc_t;

/**
* @brief start address for database in nonvolatile device.
*/
typedef struct
{
	pfNVMRead fNVMRead;
	pfNVMWrite fNVMWrite;
} AL_DB_Init_t;

/**
* @brief Prototype define for create channel list with special attribute quickly
*/
typedef struct
{
	AL_DB_EDBType_t enDBType;
	AL_DB_ERecordType_t enRecType;
	
	BOOL bUsrSort; /* sort method */
	union
	{
		AL_DB_ESortType_t enSortType;
		AL_DB_RecordUserCmp pUserCmpCB;
	};

	AL_DB_RecordMatchFunc fpMatchFunc; /* record match function */
	void *pMatchParam;
} AL_DB_SearchParam_t;

/****************************************************
 * API definition - Component Operation
 ****************************************************//**
 * @}
 * @addtogroup COMAPI Component APIs
 * @{
 ********************************************************/
/**
* @brief Initialise database module
*
* @note This API must be called before any other APIs of this module
*
* @param pstInitParam	[in] specify the start address of the database in
*							nonvolatile device, such as flash, EEPROM
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_Init(const AL_DB_Init_t *pstInitParam);

/**
* @brief Synchronize data to physical storage .
*
* @note This API must be called after initialize function is called,
* and must be called before terminate function is called.
*
* @param eDBType		[in]Database type.
* @param bIsBlocking	[in]If set al_true, this API will not return until saving
*			 				data to flash is finished;if set al_false, no need to wait.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_Sync(AL_DB_EDBType_t eDBType, al_bool bIsBlocking);

/**
* @brief Synchronize data to physical storage .
*
* @note This API must be called after initialize function is called,
* and must be called before terminate function is called.
*
* @param eDBType		[in]Database type.
* @param pstMatchFuc	[in]pionter to Match function for each record type
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_RegisterDupliChkFunc(AL_DB_EDBType_t eDBType, const AL_DB_RecDupliChkFunc_t *pstMatchFuc);

  /****************************************************//**
 * @brief Register callback to process duplicate service
 *
 * @param pFunc[in] Function Pointer to get the process strategy when duplicate services exist.
 * @param peTuneType[in] Current tune type.
 * @param pePriSpec[in] Private spec.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 ********************************************************/
AL_Return_t AL_DB_RegisterDupliRecStrategy(fpCDBIGetDupliRecStrategy pFunc, AL_DBTuneType_t *peTuneType, AL_DBPrivateSpec_t *pePriSpec);

/**
* @brief Register Reset default value function
*
* @note Only used for ATV service at now.
*
* @param eDBType		[in]Database type.
* @param pfResetFuc		[in]pionter to Reset function
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_RegisterResetDefValFunc(AL_DB_ResetDefValFunc *pfResetFuc);

/**
* @brief Load deafault data setting to database.
*
* @note This API must be called after initialize function is called,
* and must be called before terminate function is called.
*
* @param eDBType		[in]Database type.
* @param bIsBlocking	[in]If set al_true, this API will not return until saving
*			 				data to flash is finished;if set al_false, no need to wait.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_SetDefault(AL_DB_EDBType_t eDBType, al_bool bIsBlocking);

/**
* @brief Reset database to empty.
*
* @note This API must be called after initialize function is called,
* and must be called before terminate function is called.
*
* @param eDBType		[in]Database type.
* @param bIsBlocking	[in]If set al_true, this API will not return until saving
*			 				data to flash is finished;if set al_false, no need to wait.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_Reset(AL_DB_EDBType_t eDBType, al_bool bIsBlocking);

/**
* @brief  Get every component capabitlity of databse
*
* @param eDBType			[in]Record handle.
* @param pstCapability		[in]Offset of field item in record detail.
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_GetCapability(
	AL_DB_EDBType_t eDBType,
	AL_DBCapability_t *pstCapability);

/**
* @brief Add new record to database.
*
* @param eDBType			[in]Database type.
* @param eRecType			[in]Record type.
* @param pstRecDetail		[in]Added record detail, depend on practical detail type.
* @param hParentHdl			[in]If adding service record, the param must be multiplex handle;
*								if adding multiplex record, the param must be network handle
*								others, it will be ignored and assigned default #AL_DB_INVALIDHDL.
* @param phRecHdl			[out]Record handle, return #AL_DB_INVALIDHDL when adding failed.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_AddRecord(
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	const al_void * pstRecDetail,
	AL_RecHandle_t hParentHdl,
	AL_RecHandle_t *phRecHdl);

/**
* @brief Sort record logical sequence by specified command.
*
* @note This operation can not influence record physical sequence.
*
* @param eDBType		[in]Databse type.
* @param eDBType		[in]Record type.
* @param eSortCmd		[in]Specify sort command type.
* @param bAscending	[in]al_true indecates sort by ascending,
*							and sort by descending will be set al_false.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_SortRecords(
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	AL_DB_ESortType_t eSortCmd,
	al_bool bAscending);

/**
 * @brief Sort record logical sequence by specified sorting method provide by user.
 *
 * @note This operation can not influence record physical sequence.
 *
 * @param eDBType		[in]Databse type.
 * @param eDBType		[in]Record type.
 * @param fRecUserCmpCB	[in]Specify sort method provided by user.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 */
AL_Return_t AL_DB_SortRecordsByUser(
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	AL_DB_RecordUserCmp fRecUserCmpCB);

/**
 * @brief Get children record number by its parent handle.
 *
 * @param hParentHdl	[in]Parent record handle.
 * @param puiRecCnt		[out]Record number.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 */
AL_Return_t AL_DB_GetChildRecordNum(
	AL_RecHandle_t hParentHdl,
	al_uint32 *puiRecCnt);

/**
* @brief Get record handle without deleted record.
*
* @param eRequetCmd	[in]Getting request command.
* @param eDBType		[in]Database type.
* @param eRecType		[in]Record type.
* @param phRecHdl		[in/out]Record handle.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_GetRecord(
	AL_DB_ERecordRequest_t eRequetCmd,
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	AL_RecHandle_t *phRecHdl);

/****************************************************//**
 * @brief Get record handle by Index.
 *
 * @param eDBType		[in]Database type.
 * @param eRecType		[in]Record type.
 * @param bIndex		[in]Record Index.
 * @param phRecHdl		[out]Record handle.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 ********************************************************/
AL_Return_t AL_DB_GetRecordByIndex(AL_DB_EDBType_t eDBType, AL_DB_ERecordType_t eRecType,
	al_uint8 bIndex, AL_RecHandle_t *phRecHdl);

/****************************************************//**
 * @brief Get sorted record list.
 *
 * @note If wanna get service list, it will get all type services.
 *
 * @param eDBType		[in]Databse type.
 * @param eRecType	[in]Record type.
 * @param pRecList		[in]Record list.
 * @param pRecNum		[in]Number of records in list.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 ********************************************************/
AL_Return_t AL_DB_GetRecordList (
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	AL_RecHandle_t *pRecList,
	al_uint16 *pRecNum);

/**
* @brief Get record handle by its parent handle.
*
* @note
*		If the input record is invalid record, will return the first child handle;@n
*		and if the input record is one valid child record, will return the next child handle.
* @param hParentHdl		[in]Parent record handle.
* @param phRecHdl		[in/out]Record handle.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_GetChildRecord(
	AL_RecHandle_t hParentHdl,
	AL_RecHandle_t *phRecHdl);

/**
 * @brief check whether has child record.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_HasChildRecord(AL_RecHandle_t hRecHdl, al_bool *bHasChild, al_bool *bHasGrandChild);

/**
* @brief Get record handle by user-defined matching function.
*
* @param fRecMatch		[in]Record matching function, implemented by user.
* @param pMatchParam	[in]Needed parameters of match function.
* @param eDBType		[in]Database tuye.
* @param eRecType		[in]Record type.
* @param phRecHdl		[out]The first matched record which behind of the referenced record;<br>
* 							if hRefHdl = AL_DB_INVALIDHDL, indicates getting first matched record in database.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_GetMatchedRecord(
	AL_DB_RecordMatchFunc fRecMatch,
	al_void *pMatchParam,
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	AL_DB_ERecordRequest_t eReqCmd,
	AL_RecHandle_t *phRecHdl);

/**
* @brief Get database type and record type of record.
*
* @param hRecHdl		[in]Record handle.
* @param peDBType		[out]Database type.
* @param peRecType		[out]Record type.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_GetRecordType(
	AL_RecHandle_t hRecHdl,
	AL_DB_EDBType_t *peDBType,
	AL_DB_ERecordType_t *peRecType);

/**
* @brief Move record to another place on logical sequence (in sorted list).
*
* @note
*		1.Move record, the rest of records will be moved;
*		2.Swap record, the rest of records won't be moved.
*
* @param eMoveCmd		[in]Specify move command, contain move and swap commands.
* @param hCurrRecHdl	[in]Current rec handle.
* @param hRefRecHdl	[in]Referenced service handle,
*							its using depends on move command.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_MoveRecord(
	AL_DB_EMoveType_t eMoveCmd,
	AL_RecHandle_t hCurrRecHdl,
	AL_RecHandle_t hRefRecHdl);

/**
* @brief Remove record from physical storage.
*
* @note
* 	1.When remove one multiplex, all services belonged it will be removed;
* 	2.when remove one network, all muliplexes and services belonged it will be removed.
*
* @param hRecHdl	[in]Record handle.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_RemoveRecord(AL_RecHandle_t hRecHdl);

/**
* @brief Get total number of records, without deleted records.
*
* @note
*		1.For Analog service, get number of all inused services;
*		2.For DVB service, get number of all undeleted services.
*
* @param eDBType	[in]Databse type.
* @param eRecType	[in]Record type.
* @param pu32Num	[out]Total number of records.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_GetRecordsTotalNum(
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	al_uint32 *pu32Num);

/****************************************************//**
 * @brief Get searched service list which match the searching condition.
 *
 * @param fRecMatch		[in]Match function, refers to prototype #AL_DB_RecordMatchFunc.
 * @param pMatchParam		[in]Parameter provided for match function, the type indicated by user.
 * @param eDBType			[in]Database type.
 * @param eRecType		[in]Record type.
 * @param hRecHdl		[in]Record handle.
 * @param u32NeedNum		[in]Specify upper limitation of searched records number.
 * @param u32SearchOffset	[in]Specify passed records number,
 * 							and the rest of matched records will be add to the list.
 * @param pu32TotalNum	[out]Total number of matched records.
 * @param pu32GotNum		[out]The number of gotten records.
 * @param pstRecList		[out]Searched records list.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 *
 ********************************************************/
AL_Return_t AL_DB_SearchChildRecords(
	AL_DB_RecordMatchFunc fRecMatch,
	al_void *pMatchParam,
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	AL_RecHandle_t hRecHdl,
	al_uint32 u32NeedNum,
	al_uint32 u32SearchOffset,
	al_uint32 *pu32TotalNum,
	al_uint32 *pu32GotNum,
	AL_RecHandle_t *pstRecList);

/**
* @brief Get searched service list which match the searching condition.
*
* @param fRecMatch			[in]Match function, refers to prototype #AL_DB_RecordMatchFunc.
* @param pMatchParam		[in]Parameter provided for match function, the type indicated by user.
* @param eDBType			[in]Database type.
* @param eRecType			[in]Record type.
* @param u32NeedNum		[in]Specify upper limitation of searched records number.
* @param u32SearchOffset	[in]Specify passed records number,
* 								and the rest of matched records will be add to the list.
* @param pu32TotalNum		[out]Total number of matched records.
* @param pu32GotNum		[out]The number of gotten records.
* @param pstRecList			[out]Searched records list.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_SearchRecords(
	AL_DB_RecordMatchFunc fRecMatch,
	al_void *pMatchParam,
	AL_DB_EDBType_t eDBType,
	AL_DB_ERecordType_t eRecType,
	al_uint32 u32NeedNum,
	al_uint32 u32SearchOffset,
	al_uint32 *pu32TotalNum,
	al_uint32 *pu32GotNum,
	AL_RecHandle_t *pstRecList);

AL_Return_t AL_DB_SearchRecordsExt(AL_DB_RecordMatchFunc fRecMatch, al_void *pMatchParam,
	AL_DB_EDBType_t eDBType, AL_DB_ERecordType_t eRecType, al_uint32 uiSkipNum, AL_RecHandle_t *pstRecList, al_uint32 *puiRecNum);

/**
* @brief  Querys record detail.
*
* @param hRecHdl		[in]Record handle.
* @param pItemData		[out]Record detail data.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_QueryDetail(AL_RecHandle_t hRecHdl, al_void *pDetailData);

/**
* @brief  Update record detail.
*
* @param hRecHdl		[in]Record handle.
* @param pItemData		[in]Record detail data.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_UpdateDetail(AL_RecHandle_t hRecHdl, const al_void *pDetailData);

/**
* @brief  Query any one field of detail.
*
* @param hRecHdl		[in]Record handle.
* @param u32ItemOffset	[in]Offset of field item in record detail.
* @param u16ItemBytes	[in]Byte length of field data.
* @param pItemData		[out]Specified detail field data.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_QueryDetailField(
	AL_RecHandle_t hRecHdl,
	al_uint16 u16ItemOffset,
	al_uint16 u16ItemBytes,
	al_void *pItemData);

/**
* @brief  Query any one field of detail by field name.
*
* @param hRecHdl		[in]Record handle.
* @param pItemName	[in]Field name, defined in detail structure.
* @param pItemData		[in]Specified detail field data.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_QueryDetailFieldByName(
	AL_RecHandle_t hRecHdl,
	al_uint8 *pItemName,
	al_void *pItemData);

/**
* @brief  Update any one field of detail.
*
* @param hRecHdl		[in]Record handle.
* @param u32ItemOffset	[in]Offset of field item in record detail.
* @param u16ItemBytes	[in]Byte length of field data.
* @param pItemData		[in]Specified detail field data.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_UpdateDetailField(
	AL_RecHandle_t hRecHdl,
	al_uint16 u16ItemOffset,
	al_uint16 u16ItemBytes,
	al_void *pItemData);

/**
* @brief  Update any one field of detail by field name.
*
* @param hRecHdl		[in]Record handle.
* @param pItemName	[in]Field name, defined in detail structure.
* @param pItemData		[in]Specified detail field data.
*
* @return
* 	#AL_SUCCESS indicates success,
* 	On failure, #AL_FAILURE is returned.
*/
AL_Return_t AL_DB_UpdateDetailFieldByName(
	AL_RecHandle_t hRecHdl,
	al_uint8 *pItemName,
	al_void *pItemData);


/****************************************************//**
 * @brief  check whether has valid services.
 *
 * @param eDBType			[in]Database type.
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 ********************************************************/
al_bool AL_DB_HasVisibleService(AL_DB_EDBType_t eDBType);

/****************************************************//**
 * @brief Get channel list with special attributs(like scramble channel list, free channel list etc.)
 *
 * @param pSortParam sort parameters
 *
 * @param phRec input buffer
 *
 * @param uiRecNum buffer size
 *
 * @retval  DB_SUCCESS means succss.  DB_FAILURE means failed.
 ********************************************************/
AL_Return_t AL_DB_GetRecSortListWithGivenParams(
	AL_DB_SearchParam_t *pSortParam, AL_RecHandle_t **phRec, UINT32 *puiRecNum);

/****************************************************//**
 * @brief  check record handle is valid
 *
 * @param hRecHdl			[in]record handle
 *
 * @return
 * 	#AL_SUCCESS indicates success,
 * 	On failure, #AL_FAILURE is returned.
 ********************************************************/
al_bool AL_DB_CheckRecValid(AL_RecHandle_t hRecHdl);


/****************************************************//**
  * @}
  ********************************************************/
#ifdef __cplusplus
	}
#endif /* __cplusplus */

#endif /* __AL_DATABASE_COMMON_H__*/

