-/* Copyright (C) 2003,2004,2005,2006,2011 MORIOKA Tomohiko
+/* Copyright (C) 2003, 2004, 2005, 2006, 2011, 2013 MORIOKA Tomohiko
This file is part of the CONCORD Library.
The CONCORD Library is free software; you can redistribute it and/or
#include "concord.h"
#include "cos-i.h"
#include "concord-name.h"
+#include "cos-hash.h"
#include "concord-bdb.h"
+COS_Feature concord_opened_feature_list = NULL;
+COS_Feature concord_opened_feature_list_last = NULL;
+size_t concord_opened_feature_list_length = 0;
+size_t concord_opened_feature_list_limit = 96;
+
+COS_Feature_INDEX concord_opened_index_list = NULL;
+COS_Feature_INDEX concord_opened_index_list_last = NULL;
+size_t concord_opened_index_list_length = 0;
+size_t concord_opened_index_list_limit = 32;
+
int
CONCORD_String_size (const CONCORD_String s)
CONCORD_Object object_nil;
CONCORD_Object (*read_object) (const unsigned char* str, size_t length);
- CONCORD_NAME_TABLE* symbol_names;
};
CONCORD_Object
concord_open_ds (CONCORD_Backend_Type type, const char* location,
int subtype, int modemask)
{
-#if 0
- CONCORD_DS ds = (CONCORD_DS)malloc (sizeof (CONCORD_DS_ent));
- size_t len = strlen (location);
-
- if (ds == NULL)
- return NULL;
-
- ds->header.prefix = 0xff;
- ds->header.type = CONCORD_Object_Type_DS;
-#else
CONCORD_DS ds = COS_ALLOCATE_OBJECT (DS);
size_t len = strlen (location);
if (ds == NULL)
return NULL;
-#endif
ds->type = type;
ds->subtype = ( (subtype != 0) ? subtype : DB_HASH );
return NULL;
}
- ds->symbol_names = concord_make_name_table ();
- if (ds->symbol_names == NULL)
- {
- concord_destroy_name_table (ds->genre_names);
- free (ds->location);
- free (ds);
- return NULL;
- }
-
ds->object_nil = NULL;
ds->read_object = &concord_default_read_object;
free (ds->location);
if (ds->genre_names != NULL)
concord_destroy_name_table (ds->genre_names);
- if (ds->symbol_names != NULL)
- concord_destroy_name_table (ds->symbol_names);
free (ds);
return 0;
}
if (ds == NULL)
return NULL;
-#if 0
- genre = (CONCORD_Genre)malloc (sizeof (CONCORD_Genre_ent));
- if (genre == NULL)
- return NULL;
-
- genre->header.prefix = 0xff;
- genre->header.type = CONCORD_Object_Type_Genre;
-#else
genre = COS_ALLOCATE_OBJECT (Genre);
if (genre == NULL)
return NULL;
-#endif
genre->ds = ds;
genre->name = (char*)malloc (len + 1);
}
-struct COS_Feature_ent
-{
- COS_Object_Header header;
- CONCORD_Genre genre;
- char* name;
- DB* db;
- u_int32_t access;
-};
-
CONCORD_Feature
concord_genre_open_feature (CONCORD_Genre genre, const char* feature)
{
if (genre == NULL)
return NULL;
-#if 0
- table = (CONCORD_Feature)malloc (sizeof (CONCORD_Feature_ent));
- if (table == NULL)
- return NULL;
-
- table->header.prefix = 0xff;
- table->header.type = CONCORD_Object_Type_Feature;
-#else
table = COS_ALLOCATE_OBJECT (Feature);
if (table == NULL)
return NULL;
-#endif
table->genre = genre;
table->db = NULL;
return NULL;
}
strcpy (table->name, feature);
+ table->value_table = NULL;
+ table->next = NULL;
return table;
}
{
CONCORD_Genre genre = feature->genre;
+ if ( concord_opened_feature_list_length
+ >= concord_opened_feature_list_limit )
+ {
+ CONCORD_Feature top_feature = concord_opened_feature_list;
+
+ CONCORD_BDB_close (top_feature->db);
+ top_feature->db = NULL;
+ concord_opened_feature_list = top_feature->next;
+ top_feature->next = NULL;
+ concord_opened_feature_list_length--;
+ }
feature->db
= CONCORD_BDB_open (genre->ds->location, genre->name,
"feature", feature->name,
if (feature->db == NULL)
return -1;
feature->access = access;
+ if ( concord_opened_feature_list == NULL )
+ {
+ concord_opened_feature_list = feature;
+ concord_opened_feature_list_last = feature;
+ }
+ else
+ {
+ concord_opened_feature_list_last->next = feature;
+ concord_opened_feature_list_last = feature;
+ }
+ concord_opened_feature_list_length++;
}
return 0;
}
}
-struct COS_Feature_INDEX_ent
-{
- COS_Object_Header header;
- CONCORD_Genre genre;
- char *name;
- DB* db;
- u_int32_t access;
-};
-
CONCORD_INDEX
concord_genre_open_index (CONCORD_Genre genre, const char* index)
{
if (genre == NULL)
return NULL;
-#if 0
- table = (CONCORD_INDEX)malloc (sizeof (CONCORD_INDEX_ent));
- if (table == NULL)
- return NULL;
-
- table->header.prefix = 0xff;
- table->header.type = CONCORD_Object_Type_INDEX;
-#else
table = COS_ALLOCATE_OBJECT (Feature_INDEX);
if (table == NULL)
return NULL;
-#endif
table->genre = genre;
table->db = NULL;
return NULL;
}
strcpy (table->name, index);
+ table->decoding_table = NULL;
+ table->next = NULL;
return table;
}
{
CONCORD_Genre genre = index->genre;
+ if ( concord_opened_index_list_length
+ >= concord_opened_index_list_limit )
+ {
+ CONCORD_INDEX top_index = concord_opened_index_list;
+
+ CONCORD_BDB_close (top_index->db);
+ top_index->db = NULL;
+ concord_opened_index_list = top_index->next;
+ top_index->next = NULL;
+ concord_opened_index_list_length--;
+ }
index->db
= CONCORD_BDB_open (genre->ds->location, genre->name,
"index", index->name,
if (index->db == NULL)
return -1;
index->access = access;
+ if ( concord_opened_index_list == NULL )
+ {
+ concord_opened_index_list = index;
+ concord_opened_index_list_last = index;
+ }
+ else
+ {
+ concord_opened_index_list_last->next = index;
+ concord_opened_index_list_last = index;
+ }
+ concord_opened_index_list_length++;
}
return 0;
}