まとめて、そのサイズを返します。「"piyo","hugahuga"\n」を格納し、その終端を表すためにサイズを返すのがこの関数のゴールです。カラム情報を読み取るためのフラグを立てています。変数から情報を取得する際にアサーションで落ちてしまいます。それぞれの値が格納されてきます。入ってくるイメージです。ループを回してそれぞれのカラムを処理していきます。格納されている値は末尾に大量のスペースが入っていることです。実際の値なのか判断する必要があります。挿入すべき文字列の長さ(=文字列の終端)を格納しています。ループの終了条件になります。「"piyo","hugahuga"\n」という文字列が格納されます。文字列が追記されているはずです。処理は実装できました。テーブルスキャンテーブルの作成やオープンはそれぞれに対応する関数を一つ実装するだけでしたが、テーブルスキャンでは複数の関数の実装が必要になります。ストレージエンジンが5行取得する際の関数コールの流れですが、眺めてみるとなんとなくテーブルスキャンの流れを掴めると思います。openつまり実装が必要なのは、store_lock()内部ロックexternal_lock()外部ロックなどinfo()最適化情報の設定rnd_init()テーブルスキャンの準備extra()ヒントの設定rnd_next()行の読み取りの6つです。サーバがロックを取得しようとした時に呼び出される関数です。呼び出すことで、ストレージエンジン側にもロックの裁量を与えているみたいです。サーバ側で判断したロック種別をストレージエンジンに合わせたものに変更できるようにしているみたいですが、今回は細かいロック機構を実装するつもりはありませんし、ぶっちゃけどんな状況でこのロックの変更が必要になるのか不明なので変更しないでおきます(一切ロックを提供しないストレージエンジンではここに何も書かないとかになりそう)。to;}external_lock()外部ロックのためのフックです。外部ロックは簡単に言えば、テーブルデータファイルへのファイルロックのことです。サーバが単一のデータファイルを弄る場合なんかで競合を回避するために外部ロックが必要になります。返すだけの実装でいきます。DBUG_RETURN(0);}rnd_init()テーブルスキャンのための準備をする関数です。データファイル内をトレースするためのポジション情報やレコード数情報を初期化しておきます。DBUG_RETURN(0);}ポジション情報はハンドラに持たせておきます。~~info()最適化のためにオプティマイザが使う統計情報などを設定する関数です。結果は、ここで設定された情報が基になっているようです。例によって細かい実装はしませんが、以下のコードだけ入れておきます。DBUG_RETURN(0);}コメントによればレコード数が0もしくは1の場合と、2以上の場合とで、オプティマイザの処理が変わるみたいで、前者だとテーブルスキャンの時に全部のレコードが読まれない可能性があるっぽいです(詳しいことはわかりません)。2以上の値を返しておく感じで。サーバ側からストレージエンジンの動作に対してヒントを送るための関数らしいですが、これも拡張的というか応用的な機能なのでスルーします。操作するファイルの種類に応じてスキャン動作を変えたりする時なんかに必要なのかもしれません。データファイルから実際にレコードを読み取る関数です。テーブルスキャンは、終了条件を満たすまでこいつが呼ばれ続ける形で行われます。イメージとしては、1行読み取る度に1回この関数が呼ばれる感じです。返して処理を終了してあげるのが正常な動作です。まで読んでいくだけの実装をしてみます。ファイルから読み取ったレコードを格納する先です。格納してもらい、結果をクライアントに返す形になっています。内では大枠の処理だけ書いています。先頭を0で埋めています。指示ビットマップだからです(カラムの内容はその後に続きます)。あることを明示するための仕組みです。このビットマップ部分をすべて0に設定しているわけです。0を埋めるサイズの指定にはこれを使います。指示とは関係のない開始ビットが付加されます。カラムを2つ用意した場合の挙動は以下のようになります。表現できるように実装する必要があります。書き込み用のフラグを立てることです。書き込むときにアサーションエラーになります。回します(カラム数文回ります)。いうメンバです(カラムデータのインメモリコピーと言えます)。同じ場所を指しています。格納しているコードが存在しないのはこのためです。扱っている形になります。格納しているだけの単純なものです。各行に対して呼ばれるので、複数行を読み取る場合には「現在どこの行まで読んだか」を記録しておく必要があります。管理していて、文字を読む度にカウントしています。以上が読み取り処理の実装になります。格納したデータがしっかりと返っくるはずです。ta_test;おわりということで、ストレージエンジンの基本的な入出力機能を一通り実装してみました。本格的にやろうとすると、ここから更にインデクシングやロッキングなどの高度な機能が必要になりますが、とりあえずこれだけでもストレージエンジンの概要はざっくりと掴めた気がします。謎のビルドエラーでハマったりして面倒臭さが強烈でしたが、気が向いたらその辺の機能もまた実装してみようかなあと思います。05:30MySQLのストレージエンジンを自作してみるTweet広告を非表示にする関連記事2018-10-12【MySQL】データベースのパーティショニングとはなんぞやという話パーティショニングについての覚書。»プロフィールid:norikone都内で勉強しているフリをしている学生です。気が向いた時に技術系の備忘録などをテキトーに書いていこうと思います。(1)月別アーカイブはてなブログをはじめよう!norikoneさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。