svnno****@sourc*****
svnno****@sourc*****
2008年 6月 20日 (金) 16:12:00 JST
Revision: 155 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=tritonn&view=rev&rev=155 Author: mir Date: 2008-06-20 16:12:00 +0900 (Fri, 20 Jun 2008) Log Message: ----------- improved handling of sen_db isntance. Modified Paths: -------------- trunk/src/ha_tritonn.cc trunk/src/ha_tritonn.h -------------- next part -------------- Modified: trunk/src/ha_tritonn.cc =================================================================== --- trunk/src/ha_tritonn.cc 2008-06-19 03:32:06 UTC (rev 154) +++ trunk/src/ha_tritonn.cc 2008-06-20 07:12:00 UTC (rev 155) @@ -24,6 +24,9 @@ TABLE_SHARE *table, MEM_ROOT *mem_root); +static TRITONN_DB *tdb; +static sen_db *get_sen_db(const char *db_name); + /* delete database files */ static void tritonn_drop_database(handlerton *hton, char* path); @@ -88,6 +91,10 @@ if (tritonn_open_tables.records) error= 1; hash_free(&tritonn_open_tables); + while (tdb != NULL) { + sen_db_close(tdb->db); + tdb = tdb->next; + } pthread_mutex_destroy(&tritonn_mutex); sen_fin(); @@ -219,6 +226,7 @@ return "SENNA"; } +/* TODO: examin this feature */ static const char *ha_tritonn_exts[] = { NullS }; @@ -232,9 +240,8 @@ // see $MYSQL_SRC/sql/handler.h "bits in table_flags" ulonglong ha_tritonn::table_flags() const { DBTN; - return (HA_NO_TRANSACTIONS | HA_REQUIRE_PRIMARY_KEY | - HA_STATS_RECORDS_IS_EXACT | HA_NO_PREFIX_CHAR_KEYS | HA_CAN_FULLTEXT | - HA_NO_AUTO_INCREMENT); + return (HA_NO_TRANSACTIONS | HA_STATS_RECORDS_IS_EXACT | + HA_NO_PREFIX_CHAR_KEYS | HA_CAN_FULLTEXT | HA_NO_AUTO_INCREMENT); } // see $MYSQL_SRC/sql/handler.h, "bits in index_flags" @@ -270,7 +277,7 @@ DBUG_RETURN(HA_ERR_OUT_OF_MEM); thr_lock_data_init(&share->lock,&lock,NULL); - ctx = sen_ctx_open(db,SEN_CTX_USEQL); + ctx = sen_ctx_open(get_sen_db(table_share->db.str),SEN_CTX_USEQL); DBUG_RETURN(0); } @@ -334,15 +341,9 @@ { DBUG_ENTER("ha_tritonn::create"); DBTN; + char buf[FN_REFLEN]; //dump_create(name,table_arg,create_info); - char buf[1024]; - my_snprintf(buf,1024,"%s/tritonn.db",table_arg->s->db); - db = sen_db_open(buf); - if (!db) { - db = sen_db_create(buf,0,sen_enc_utf8); - } - ctx = sen_ctx_open(db,SEN_CTX_USEQL); - + ctx = sen_ctx_open(get_sen_db(table_share->db.str),SEN_CTX_USEQL); my_snprintf(buf,1024,"(ptable '<%s>)",table_arg->s->table_name); call_senna_ql(ctx,buf); int i; @@ -355,7 +356,7 @@ call_senna_ql(ctx,buf); } sen_ctx_close(ctx); - DBUG_RETURN(0); + DBUG_RETURN(0); } uint ha_tritonn::max_supported_keys() const @@ -550,8 +551,64 @@ case MYSQL_TYPE_STRING: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VARCHAR: + case MYSQL_TYPE_BLOB: return "text"; default: return "null"; } } + +int ha_tritonn::write_row(uchar* buf) +{ + DBTN; + for (Field **field=table->field; *field; field++) { + String str; + (*field)->val_str(&str); + // printf("[%s]\n",(*field)->val_str(new String[1])->ptr()); + } + + return 0; +} + +TRITONN_DB *open_or_create_db(const char *db_name) +{ + char file_name[FN_REFLEN]; + TRITONN_DB *d = (TRITONN_DB*) my_malloc(sizeof(TRITONN_DB), MYF(0)); + d->db_name_length = strlen(db_name); + d->db_name = (char*) my_malloc(d->db_name_length,MYF(0)); + memcpy(d->db_name,db_name,d->db_name_length); + my_snprintf(file_name,FN_REFLEN,"%s/tritonn.db",d->db_name); + d->db = sen_db_open(file_name); + if (d->db == NULL) { + d->db = sen_db_create(file_name,0,sen_enc_utf8); + } + d->next = NULL; + pthread_mutex_unlock(&tritonn_mutex); + return d; +} + +sen_db *get_sen_db(const char *db_name) +{ + pthread_mutex_lock(&tritonn_mutex); + /* case1: no instance created yet */ + if (tdb == NULL) { + tdb = open_or_create_db(db_name); + return tdb->db; + } + /* case2: instance hit */ + TRITONN_DB *cur = tdb; + while (true) { + if (strcmp(cur->db_name,db_name) == 0) { + pthread_mutex_unlock(&tritonn_mutex); + return cur->db; + } else if (cur->next != NULL) { + cur = cur->next; + } else { + break; + } + } + /* case3: instance not hit */ + cur->next = open_or_create_db(db_name); + pthread_mutex_unlock(&tritonn_mutex); + return cur->next->db; +} Modified: trunk/src/ha_tritonn.h =================================================================== --- trunk/src/ha_tritonn.h 2008-06-19 03:32:06 UTC (rev 154) +++ trunk/src/ha_tritonn.h 2008-06-20 07:12:00 UTC (rev 155) @@ -4,6 +4,13 @@ #include <senna/senna.h> +typedef struct st_tritonn_db { + char *db_name; + uint db_name_length; + sen_db *db; + st_tritonn_db *next; +} TRITONN_DB; + /** @brief TRITONN_SHARE is a structure that will be shared among all open handlers. This implements the minimum of what you will probably need. @@ -19,8 +26,6 @@ { THR_LOCK_DATA lock; // MySQL lock TRITONN_SHARE *share; // Shared lock info - - sen_db *db; sen_ctx *ctx; public: @@ -66,6 +71,7 @@ uint max_supported_keys() const; uint max_supported_key_length() const; uint max_supported_key_part_length() const; + int write_row(uchar *buf); }; #ifdef DEBUG_TRITONN