16.11. 为存储引擎添加对INSERT的支持

一旦在你的存储引擎中有了读支持,下一个需要实施的特性是对 INSERT语句的支持。有了INSERT支持,存储引擎就能处理 WORM(写一次,读多次)应用程序,如用于以后分析的日志和归档应用等。

所有的INSERT操作均是通过write_row()函数予以处理的:

int ha_foo::write_row(byte *buf)  

*buf参数包含将要插入的行,采用内部MySQL格式。基本的存储引擎将简单地前进到数据文件末尾,并直接在末尾处添加缓冲的内容,这样就能使行读取变得简单,这是因为,你可以读取行并将其直接传递到rnd_next()函数的缓冲参数中。

写入行的进程与读取行的进程相反:从MySQL内部行格式获取数据,并将其写入数据文件。下述示例来自CSV存储引擎:

int ha_tina::write_row(byte * buf)
 {
   int size;
   DBUG_ENTER("ha_tina::write_row");
 
   statistic_increment(table->in_use->status_var.ha_write_count, &LOCK_status);
 
   if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
     table->timestamp_field->set_time();
 
   size= encode_quote(buf);
 
   if (my_write(share->data_file, buffer.ptr(), size, MYF(MY_WME | MY_NABP)))
     DBUG_RETURN(-1);
 
   if (get_mmap(share, 0) > 0)
     DBUG_RETURN(-1);
   DBUG_RETURN(0);
 }

前述示例中的两条注释包括,更新关于写入操作的表统计,以及在写入行之前设置时间戳。

关注编程学问公众号