實(shí)施rnd_next()函數(shù) |
發(fā)布時(shí)間: 2012/8/23 16:52:15 |
完成表的初始化操作后,MySQL服務(wù)器將調(diào)用處理程序的rnd_next()函數(shù),每?jī)蓚(gè)掃描行調(diào)用1次,直至滿足了服務(wù)器的搜索條件或到達(dá)文件結(jié)尾為止,在后一種情況下,處理程序?qū)⒎祷?span style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">HA_ERR_END_OF_FILE。
rnd_next()函數(shù)有一個(gè)名為*buf的單字節(jié)數(shù)組參數(shù)。對(duì)于*buf參數(shù),必須按內(nèi)部MySQL格式用表行的內(nèi)容填充它。
服務(wù)器采用了三種數(shù)據(jù)格式:固定長(zhǎng)度行,可變長(zhǎng)度行,以及具有BLOB指針的可變長(zhǎng)度行。對(duì)于每種格式,各列將按照它們由CREATE TABLE語句定義的順序顯示(表定義保存在.frm文件中,優(yōu)化程序和處理程序均能從相同的源,即TABLE結(jié)構(gòu),訪問表的元數(shù)據(jù))。 電腦知識(shí)www.boydavid.com 每種格式以每列1比特的"NULL bitmap"開始。對(duì)于含6個(gè)列的表,其bitmap為1字節(jié),對(duì)于含9~16列的表,其bitmap為2字節(jié),依此類推。要想指明特定的值是NULL,應(yīng)將該列NULL位設(shè)置為1。 計(jì)算機(jī)愛好者www.boydavid.com 當(dāng)NULL bitmap逐個(gè)進(jìn)入列后,每列將具有MySQL手冊(cè)的“MySQL數(shù)據(jù)類型”一節(jié)中指定的大小。在服務(wù)器中,列的數(shù)據(jù)類型定義在sql/field.cc文件中。對(duì)于固定長(zhǎng)度行格式,列將簡(jiǎn)單地逐個(gè)放置。對(duì)于可變長(zhǎng)度行,VARCHAR列將被編碼為1字節(jié)長(zhǎng),后跟字符串。對(duì)于具有BLOB列的可變長(zhǎng)度行,每個(gè)blob由兩部分表示:首先是表示BLOB實(shí)際大小的整數(shù),然后是指向內(nèi)存中BLOB的指針。 計(jì)算機(jī)愛好者www.boydavid.com 在任何表處理程序中從rnd_next()開始,可找到行轉(zhuǎn)換(或“包裝”)的示例。例如,在ha_tina.cc中,find_current_row()內(nèi)的代碼給出了使用TABLE結(jié)構(gòu)(由表指向的)和字符串對(duì)象(命名緩沖)包裝字符數(shù)據(jù)(來自CSV文件)的方法。將行寫回磁盤需要反向轉(zhuǎn)換,從內(nèi)部格式解包。 計(jì)算機(jī)學(xué)習(xí)網(wǎng)站www.boydavid.com 下述示例來自CSV存儲(chǔ)引擎:
int ha_tina::rnd_next(byte *buf)
{ 計(jì)算機(jī)學(xué)習(xí)網(wǎng)站www.boydavid.com
DBUG_ENTER("ha_tina::rnd_next");
電腦維護(hù)www.boydavid.com
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count, &LOCK_status);
current_position= next_position;
if (!share->mapped_file)
DBUG_RETURN(HA_ERR_END_OF_FILE);
if (HA_ERR_END_OF_FILE == find_current_row(buf) ) 本文出自:億恩科技【www.allwellnessguide.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |