@@ -779,6 +779,26 @@ unsigned int AGMDB_hash(const char* key, int key_len, unsigned int output_val_ra
779779return hash;
780780}
781781
782+ /* *
783+ ** Initialize the handle of AG Memory Database.
784+ ** @param dbm: the handle of AG Memory Database.
785+ ** return: if AGMDB_SUCCESS if success
786+ ** or AGMDB_ERROR if the handle is NULL.
787+ */
788+ int Handle_init (struct agmdb_handler * dbm) {
789+ if (dbm ==NULL )
790+ return AGMDB_ERROR_HANDLE_NULL;
791+ dbm->shm_base =NULL ;
792+ #ifndef _WIN32
793+ dbm->linux_shm_id = -1 ;
794+ dbm->db_lock .sem_id = -1 ;
795+ #else
796+ dbm->win_shm_handle = INVALID_HANDLE_VALUE;
797+ dbm->db_lock .read_lock_handle = INVALID_HANDLE_VALUE;
798+ dbm->db_lock .write_lock_handle = INVALID_HANDLE_VALUE;
799+ #endif
800+ return AGMDB_SUCCESS;
801+ }
782802
783803/* *
784804**========================================================
@@ -996,63 +1016,112 @@ inline int AGMDB_deleteEntry(CPTR_VOID shm_base, PTR_OFFSET entry_id) {
9961016** return: AGMDB_SUCCESS if successfully created or AGMDB_ERROR if failed.
9971017*/
9981018int AGMDB_openDB (struct agmdb_handler * dbm,const char * db_name,int db_name_length,unsigned int entry_num) {
999- int rc ;
1000- PTR_VOID shm_base ;
1019+ int rc = AGMDB_SUCCESS ;
1020+ int rc_shm = AGMDB_SUCCESS ;
10011021
1002- if (dbm ==NULL )
1003- return AGMDB_ERROR_HANDLE_NULL;
1004- if (db_name ==NULL )
1022+ rc =Handle_init (dbm);
1023+ if (rc != AGMDB_SUCCESS) {
1024+ return rc;
1025+ }
1026+
1027+ /* Check the format of db_name*/
1028+ if (db_name ==NULL ) {
10051029return AGMDB_ERROR_NAME_NULL;
1006- if (db_name_length <=0 )
1030+ }
1031+ else if (db_name_length <=0 ) {
10071032return AGMDB_ERROR_NAME_INVALID_STRING;
1008-
1009-
1010- // Check the format of db_name
1011- if (AGMDB_isstring (db_name, db_name_length) == AGMDB_ERROR) {
1033+ }
1034+ else if (AGMDB_isstring (db_name, db_name_length) == AGMDB_ERROR) {
10121035return AGMDB_ERROR_NAME_INVALID_STRING;
10131036 }
10141037
1038+ /* Create or open the shared memory*/
10151039 rc =SHM_create (dbm, db_name, db_name_length, entry_num);
1016- if ((rc != AGMDB_SUCCESS_SHM_CREATE) && (rc != AGMDB_SUCCESS_SHM_OPEN))
1040+ if (AGMDB_isError (rc)) {
10171041return rc;
1042+ }
1043+ else if (rc != AGMDB_SUCCESS_SHM_CREATE && rc != AGMDB_SUCCESS_SHM_OPEN) {
1044+ return AGMDB_ERROR_UNEXPECTED;
1045+ }
1046+ rc_shm = rc;
10181047
1048+ /* Create or open the lock*/
10191049 rc =Lock_create (&(dbm->db_lock ), db_name, db_name_length);
1020- if ((rc != AGMDB_SUCCESS_LOCK_CREATE) && (rc != AGMDB_SUCCESS_LOCK_OPEN))
1050+ if (AGMDB_isError (rc))
1051+ {
1052+ if (rc_shm == AGMDB_SUCCESS_SHM_CREATE) {
1053+ SHM_destroy (dbm);
1054+ }
1055+ else if (rc_shm == AGMDB_SUCCESS_SHM_OPEN) {
1056+ SHM_close (dbm);
1057+ }
10211058return rc;
1059+ }
1060+ else if (rc != AGMDB_SUCCESS_LOCK_CREATE && rc != AGMDB_SUCCESS_LOCK_OPEN) {
1061+ if (rc_shm == AGMDB_SUCCESS_SHM_CREATE) {
1062+ SHM_destroy (dbm);
1063+ }
1064+ else if (rc_shm == AGMDB_SUCCESS_SHM_OPEN) {
1065+ SHM_close (dbm);
1066+ }
1067+ return AGMDB_ERROR_UNEXPECTED;
1068+ }
10221069
1023- return AGMDB_SUCCESS;
1070+ if (rc_shm == AGMDB_SUCCESS_SHM_CREATE) {
1071+ return AGMDB_SUCCESS_DB_CREATE;
1072+ }
1073+ else {
1074+ return AGMDB_SUCCESS_DB_OPEN;
1075+ }
10241076}
10251077
10261078/* *
1027- ** Close and destroy a database.
1028- ** @param dbm: the database you want to destroy.
1029- ** return: AGMDB_SUCCESS if successfully destroyed or AGMDB_ERROR if failed.
1030- */
1079+ ** Close and destroy a database.
1080+ ** @param dbm: the database you want to destroy.
1081+ ** return: AGMDB_SUCCESS if successfully destroyed or AGMDB_ERROR if failed.
1082+ */
10311083int AGMDB_destroyDB (struct agmdb_handler *dbm) {
1032- int rc;
1084+ int rc = AGMDB_SUCCESS;
1085+ int rc_shm = AGMDB_SUCCESS;
1086+ int rc_lock = AGMDB_SUCCESS;
1087+
10331088if (dbm ==NULL )
10341089return AGMDB_ERROR_HANDLE_NULL;
1035- rc =SHM_destroy (dbm);
1036- if (rc != AGMDB_SUCCESS)
1090+
1091+ rc =AGMDB_closeDB (dbm);
1092+ if (AGMDB_isError (rc))
10371093return rc;
10381094
1039- return Lock_destroy (&(dbm->db_lock ));
1095+ rc_shm =SHM_destroy (dbm);
1096+ rc_lock =Lock_destroy (&(dbm->db_lock ));
1097+ if (AGMDB_isError (rc_shm))
1098+ return rc_shm;
1099+ else if (AGMDB_isError (rc_lock))
1100+ return rc_lock;
1101+ else
1102+ return AGMDB_SUCCESS;
10401103}
10411104
10421105/* *
1043- ** Close a database, but does not destroy it.
1044- ** @param dbm: the database you want to close.
1045- ** return: AGMDB_SUCCESS if successfully closed or AGMDB_ERROR if failed.
1046- */
1106+ ** Close a database, but does not destroy it.
1107+ ** @param dbm: the database you want to close.
1108+ ** return: AGMDB_SUCCESS if successfully closed or AGMDB_ERROR if failed.
1109+ */
10471110int AGMDB_closeDB (struct agmdb_handler *dbm) {
1048- int rc;
1111+ int rc_shm = AGMDB_SUCCESS;
1112+ int rc_lock = AGMDB_SUCCESS;
1113+
10491114if (dbm ==NULL )
10501115return AGMDB_ERROR_HANDLE_NULL;
1051- rc =SHM_close (dbm);
1052- if (rc != AGMDB_SUCCESS)
1053- return rc;
1054-
1055- return Lock_close (&(dbm->db_lock ));
1116+
1117+ rc_shm =SHM_close (dbm);
1118+ rc_lock =Lock_close (&(dbm->db_lock ));
1119+ if (AGMDB_isError (rc_shm))
1120+ return rc_shm;
1121+ else if (AGMDB_isError (rc_lock))
1122+ return rc_lock;
1123+ else
1124+ return AGMDB_SUCCESS;
10561125}
10571126
10581127/* *