view src/aci2/aci/db.h @ 686:59f07d67eb45

luna target split into luna1 and luna2 luna1 is FC Luna based on iWOW DSK v4.0 or v5.0 motherboard luna2 is FC Luna based on FC Caramel2 MB
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 12 Oct 2020 18:51:24 +0000
parents 93999a60b835
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  PHB 
|  Modul   :  DBM
+----------------------------------------------------------------------------- 
|  Copyright 2005 Texas Instruments Berlin, AG 
|                 All rights reserved. 
| 
|                 This file is confidential and a trade secret of Texas 
|                 Instruments Berlin, AG 
|                 The receipt of or possession of this file does not convey 
|                 any rights to reproduce or disclose its contents or to 
|                 manufacture, use, or sell anything it may describe, in 
|                 whole, or in part, without the specific written consent of 
|                 Texas Instruments Berlin, AG. 
+----------------------------------------------------------------------------- 
|  Purpose :  Interface betweeen ACI_SIM and DBM module
+----------------------------------------------------------------------------- 
*/ 
#ifndef DB_H
#define DB_H

#include "typedefs.h"
#define DB_MAX_AFFECTED	5           /* As per architecture document */

#define MAX_DBs					        2   /* This needs to increased if DBM is used 
                                       for storing new databases (say SMSs)   */

#define MAX_NUM_FILES			      255 /* As per architecture document           */

#define MAX_NUM_OF_SORT_INDEXS	4   /* As per architecture document           */ 

#define MAX_NUM_RECORDS			    254 /* As per architecture document           */

#define INVALID_FIELD_ID        0xFFFF  

#define INVALID_SORT_INDEX      0xFF  

/* Insertion sort is available */
#define INSERTION_SORT

/* 
    Database type 
 */
typedef enum
{

  DB_UNMANAGED,	/* Not managed (1:1 slave of another file)	*/
  DB_FREELIST,	/* Fast free list maintained			        	*/

} T_DB_TYPE;

/* 
    Database affected records (History log) 
 */
typedef struct
{

  USHORT entries;					            /* Number of affected entries	                */
  USHORT field_id[DB_MAX_AFFECTED];	  /* Elementary file, e.g. EF_ADN               */
  USHORT record[DB_MAX_AFFECTED];	    /* Corresponding record within elementary file*/

} T_DB_CHANGED;

/* 
    Database Information 
 */
typedef struct
{
  BOOL clean;	  /* Database consistent					        */
  BOOL tracked;	/* Tracked for external storage device	*/  	
} T_DB_INFO;

/* 
    File Information 
 */
typedef struct
{

  BOOL        clean;			      /* Database consistent		*/
  T_DB_TYPE   entry_type;	      /* Type of database field	*/
  USHORT      record_size;      /* Record size				    */
  USHORT      num_records;	    /* Number of records		  */
  USHORT      used_records;	    /* Number of used records	*/

} T_DB_INFO_FIELD;

/* 
    Search node
    Note: This node is internal to DBM.
 */
typedef struct
{

  UBYTE top;
  UBYTE bottom;

} T_DB_SEARCH_NODE;

/* 
    Database return codes 
 */ 
typedef enum
{

  DB_OK					        =  0,	/* Execution of command completed         */
  DB_FAIL				        = -1,	/* Execution of command failed within db  */
  DB_FAIL_FS			      = -2,	/* Unexpected failure of FFS              */
  DB_FULL				        = -3,	/* Database is full                       */
  DB_INVALID_DB			    = -4,	/* Database handle not known              */
  DB_INVALID_FIELD		  = -5,	/* Invalid index requested                */
  DB_INVALID_RECORD		  = -6,	/* Invalid record requested               */
  DB_INVALID_INDEX		  = -7,	/* Invalid index requested                */
  DB_INVALID_SIZE		    = -8,	/* Invalid size given                     */
  DB_EMPTY_RECORD		    = -9,	/* Attempted to read a free record		    */

/* Architecture document need to be updated for following constants     */

  DB_EXISTS				      = -10,/* Database already exists		            */
  DB_FIELD_EXISTS		    = -11,/* Elementary file already exists         */ 
  DB_HISTORY_FULL		    = -12,/* Change log full				                */
  DB_NOT_INITIALISED    = -13,/* Database not initialised               */
  DB_IN_USE             = -14,/* Database in use                        */
  DB_RECORD_NOT_FOUND   = -15 /* Record not found                       */

} T_DB_CODE;


/* 
   This function is used in db_create_index
 */

typedef int (*T_COMP_FUNC)( int db_handle, 
                            USHORT field_id, 
                            USHORT record_1, 
                            USHORT record_2,
                            ULONG  flags );

/* 
   This function is used for db_search
 */

typedef int (*T_SEARCH_FUNC)( ULONG Flags, 
                              const UBYTE* Search_tag, 
                              int db_handle, 
                              USHORT field_id,
                              USHORT record_num );

/* 
    Interface Functions 
 */

EXTERN void db_init ( void );

EXTERN int db_create ( const char* directory,
                       UBYTE       num_of_fields,
                       BOOL        tracked );

EXTERN int db_open ( const char* directory );

EXTERN T_DB_CODE db_create_field ( int        db_handle, 
                                   T_DB_TYPE  db_type, 
                                   USHORT     field_id,
                                   USHORT     record_size, 
                                   USHORT     num_of_records );

EXTERN int db_write_record ( int          db_handle, 
                             USHORT       field_id, 
                             USHORT       record_num, 
                             USHORT       offset, 
                             USHORT       length, 
                             const UBYTE* buffer );

/* 
1) If ACI would like to use incremental sort, it needs to call
   db_update_index at end of writing/deleting the record(s).
   If the index does not exist, it would be created.
 
   Note that ACI can call this function after every record or
   after 'n' records (n>1) and DB would process it properly.
 
2) If ACI would like to use quick sort, it can go for db_create_index
   at any moment. 
 
   db_create_index is compatible with db_update_index and vice versa.

*/
EXTERN T_DB_CODE db_create_index ( int          db_handle, 
                                   USHORT       field_id, 
                                   UBYTE        sort_index, 
                                   T_COMP_FUNC  compare_function, 
                                   ULONG        flags );

#ifdef INSERTION_SORT
EXTERN T_DB_CODE db_update_index ( int          db_handle, 
                                   USHORT       field_id, 
                                   UBYTE        sort_index, 
                                   T_COMP_FUNC  compare_function, 
                                   ULONG        flags );
#endif /* INSERTION_SORT */

EXTERN T_DB_CODE db_get_phy_from_idx ( int    db_handle, 
                                       USHORT field_id, 
                                       UBYTE  sort_index, 
                                       USHORT order_num );

EXTERN T_DB_CODE db_flush (int db_handle);

EXTERN int db_read_record ( int     db_handle, 
                            USHORT  field_id, 
                            USHORT  record_num, 
                            USHORT  offset, 
                            USHORT  length, 
                            UBYTE*  buffer );

EXTERN T_DB_CODE db_read_change_log ( int           db_handle, 
                                      T_DB_CHANGED* changed);

EXTERN T_DB_CODE db_delete_record ( int    db_handle,
                                    USHORT field_id, 
                                    USHORT record_num );

EXTERN T_DB_CODE db_info ( int        db_handle, 
                           T_DB_INFO* db_info );

EXTERN T_DB_CODE db_info_field ( int              db_handle,	
                                 USHORT           field_id, 
                                 T_DB_INFO_FIELD* info_field );

EXTERN int db_find_free_record	( int    db_handle,
                                  USHORT field_id );

EXTERN T_DB_CODE db_field_changed ( int    db_handle, 
                                    USHORT field_id,
                                    BOOL*  changed );

EXTERN T_DB_CODE db_record_empty ( int    db_handle,
                                   USHORT field_id,
                                   USHORT record_num,
                                   BOOL*  empty );

EXTERN int db_search ( int               db_handle, 
                       USHORT            field_id, 
                       UBYTE             sort_index, 
                       UBYTE*            order_num,
                       T_SEARCH_FUNC     search_function, 
                       ULONG             flags, 
                       const UBYTE*      search_tag );

EXTERN int db_get_last_fs_error ( void );

EXTERN T_DB_CODE db_close ( int db_handle );

EXTERN void db_exit ( void );

EXTERN T_DB_CODE db_remove_index	( int    db_handle,
                                    USHORT field_id,
                                    UBYTE  sort_index );

EXTERN T_DB_CODE db_remove_field ( int    db_handle, 
                                   USHORT field_id );

EXTERN T_DB_CODE db_remove ( const char* directory );

#endif