[Tritonn-commit 141] [svn] [155] improved handling of sen_db isntance.

Back to archive index

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


Tritonn-commit メーリングリストの案内
Back to archive index