编写自定义存储引擎5
2013-03-20 12:43
155 查看
16.10.关闭表
当MySQL服务器完成表操作时,它将调用对于使用共享访问方法的存储引擎(如CSV引擎和其他示例引擎中显示的方法),必须将它们自己从共享结构中删除:
intha_tina::close(void)
{
DBUG_ENTER("ha_tina::close");
DBUG_RETURN(free_share(share));
}
对于使用其自己共享管理系统的存储引擎,应使用任何所需的方法,在它们的处理程序中,从已打开表的共享区删除处理程序实例。
16.11.为存储引擎添加对INSERT的支持
一旦在你的存储引擎中有了读支持,下一个需要实施的特性是对INSERT语句的支持。有了INSERT支持,存储引擎就能处理WORM(写一次,读多次)应用程序,如用于以后分析的日志和归档应用等。所有的INSERT操作均是通过
intha_foo::write_row(byte*buf)
*buf参数包含将要插入的行,采用内部MySQL格式。基本的存储引擎将简单地前进到数据文件末尾,并直接在末尾处添加缓冲的内容,这样就能使行读取变得简单,这是因为,你可以读取行并将其直接传递到rnd_next()函数的缓冲参数中。
写入行的进程与读取行的进程相反:从MySQL内部行格式获取数据,并将其写入数据文件。下述示例来自CSV存储引擎:
intha_tina::write_row(byte*buf)
{
intsize;
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);
}
前述示例中的两条注释包括,更新关于写入操作的表统计,以及在写入行之前设置时间戳。
16.12.为存储引擎添加对UPDATE的支持
通过执行表扫描操作,在找到与UPDATE语句的WHERE子句匹配的行后,MySQL服务器将执行UPDATE语句,然后调用intha_foo::update_row(constbyte*old_data,byte*new_data)
*old_data参数包含更新前位于行中的数据,而*new_data参数包含行的新内容(采用MySQL内部行格式)。
更新的执行取决于行格式和存储实施方式。某些存储引擎将替换恰当位置的数据,而其他实施方案则会删除已有的行,并在数据文件末尾添加新行。
非事务性存储引擎通常会忽略*old_data参数的内容,仅处理*new_data缓冲。事务性存储引擎可能需要比较缓冲,以确定在上次回滚中出现了什么变化。
如果正在更新的表中包含时间戳列,对时间戳的更新将由update_row()调用管理。下述示例来自CSV引擎:
intha_tina::update_row(constbyte*old_data,byte*new_data)
{
intsize;
DBUG_ENTER("ha_tina::update_row");
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count,
&LOCK_status);
if(table->timestamp_field_type&TIMESTAMP_AUTO_SET_ON_UPDATE)
table->timestamp_field->set_time();
size=encode_quote(new_data);
if(chain_append())
DBUG_RETURN(-1);
if(my_write(share->data_file,buffer.ptr(),size,MYF(MY_WME|MY_NABP)))
DBUG_RETURN(-1);
DBUG_RETURN(0);
}
请注意上例中的时间戳设置。
16.13.为存储引擎添加对DELETE的支持
MySQL服务器采用了与INSERT语句相同的方法来执行DELETE语句:服务器使用rnd_next()函数跳到要删除的行,然后调用intha_foo::delete_row(constbyte*buf)
*buf参数包含要删除行的内容。对于大多数存储引擎,该参数可被忽略,但事务性存储引擎可能需要保存删除的数据,以供回滚操作使用。
下述示例来自CSV存储引擎:
intha_tina::delete_row(constbyte*buf)
{
DBUG_ENTER("ha_tina::delete_row");
statistic_increment(table->in_use->status_var.ha_delete_count,
&LOCK_status);
if(chain_append())
DBUG_RETURN(-1);
--records;
DBUG_RETURN(0);
}
前述示例的步骤是更新delete_count统计,并记录计数。
相关文章推荐
- 编写自定义存储引擎2
- 编写自定义存储引擎3
- 编写自定义存储引擎4
- 编写自定义存储引擎6
- 16. 编写自定义存储引擎
- 编写自定义存储引擎1
- Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql
- Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql
- Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql
- mysql+asp.net开发注意大全:mysql创建数据库的时候,创建新用户,并且付给权限。mysql存储过程的编写,mysql数据库引擎的区别,mysql数据库文件夹备份
- mysql 创建自定义存储引擎
- WordPress中编写自定义存储字段的相关PHP函数解析
- WordPress中编写自定义存储字段的相关PHP函数解析
- django创建表时附加数据库自定义选项的方法——如指定数据库的存储引擎
- django “如何”系列5:如何编写自定义存储系统
- django 1.8 官方文档翻译: 3-3-5 编写自定义存储系统
- mysql 两种存储引擎 MyISAM 和InnoDB
- InnoDB还是MyISAM 再谈MySQL存储引擎的选择
- 今天自己写的MySQL自定义JDBCUtils代码编写过程详解.
- mysql存储引擎