Merge pull request #739 from pingcap/disksing/minimal-interfaces

kv, table: use minimal kv interfaces
This commit is contained in:
disksing
2015-12-17 10:17:55 +08:00
8 changed files with 32 additions and 31 deletions

View File

@ -173,12 +173,12 @@ func (c *kvIndex) Create(rm RetrieverMutator, indexedValues []interface{}, h int
}
// Delete removes the entry for handle h and indexdValues from KV index.
func (c *kvIndex) Delete(rm RetrieverMutator, indexedValues []interface{}, h int64) error {
func (c *kvIndex) Delete(m Mutator, indexedValues []interface{}, h int64) error {
key, _, err := c.GenIndexKey(indexedValues, h)
if err != nil {
return errors.Trace(err)
}
err = rm.Delete(key)
err = m.Delete(key)
return errors.Trace(err)
}
@ -209,12 +209,12 @@ func (c *kvIndex) Drop(rm RetrieverMutator) error {
}
// Seek searches KV index for the entry with indexedValues.
func (c *kvIndex) Seek(rm RetrieverMutator, indexedValues []interface{}) (iter IndexIterator, hit bool, err error) {
func (c *kvIndex) Seek(r Retriever, indexedValues []interface{}) (iter IndexIterator, hit bool, err error) {
key, _, err := c.GenIndexKey(indexedValues, 0)
if err != nil {
return nil, false, errors.Trace(err)
}
it, err := rm.Seek(key)
it, err := r.Seek(key)
if err != nil {
return nil, false, errors.Trace(err)
}
@ -227,9 +227,9 @@ func (c *kvIndex) Seek(rm RetrieverMutator, indexedValues []interface{}) (iter I
}
// SeekFirst returns an iterator which points to the first entry of the KV index.
func (c *kvIndex) SeekFirst(rm RetrieverMutator) (iter IndexIterator, err error) {
func (c *kvIndex) SeekFirst(r Retriever) (iter IndexIterator, err error) {
prefix := []byte(c.prefix)
it, err := rm.Seek(prefix)
it, err := r.Seek(prefix)
if err != nil {
return nil, errors.Trace(err)
}

View File

@ -252,17 +252,17 @@ type IndexIterator interface {
// Index is the interface for index data on KV store.
type Index interface {
// Create supports insert into statement.
Create(rw RetrieverMutator, indexedValues []interface{}, h int64) error
Create(rm RetrieverMutator, indexedValues []interface{}, h int64) error
// Delete supports delete from statement.
Delete(rw RetrieverMutator, indexedValues []interface{}, h int64) error
Delete(m Mutator, indexedValues []interface{}, h int64) error
// Drop supports drop table, drop index statements.
Drop(rw RetrieverMutator) error
Drop(rm RetrieverMutator) error
// Exist supports check index exists or not.
Exist(rw RetrieverMutator, indexedValues []interface{}, h int64) (bool, int64, error)
Exist(rm RetrieverMutator, indexedValues []interface{}, h int64) (bool, int64, error)
// GenIndexKey generates an index key.
GenIndexKey(indexedValues []interface{}, h int64) (key []byte, distinct bool, err error)
// Seek supports where clause.
Seek(rw RetrieverMutator, indexedValues []interface{}) (iter IndexIterator, hit bool, err error)
Seek(r Retriever, indexedValues []interface{}) (iter IndexIterator, hit bool, err error)
// SeekFirst supports aggregate min and ascend order by.
SeekFirst(rw RetrieverMutator) (iter IndexIterator, err error)
SeekFirst(r Retriever) (iter IndexIterator, err error)
}

View File

@ -18,6 +18,7 @@
package stmts
import (
"github.com/juju/errors"
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/rset"
"github.com/pingcap/tidb/stmt"
@ -61,5 +62,9 @@ func (s *TruncateTableStmt) Exec(ctx context.Context) (rset.Recordset, error) {
if err != nil {
return nil, err
}
return nil, t.Truncate(ctx)
txn, err := ctx.GetTxn(false)
if err != nil {
return nil, errors.Trace(err)
}
return nil, t.Truncate(txn)
}

View File

@ -76,7 +76,7 @@ type Table interface {
RecordKey(h int64, col *column.Col) []byte
// Truncate truncates the table.
Truncate(ctx context.Context) (err error)
Truncate(rm kv.RetrieverMutator) (err error)
// AddRecord inserts a row into the table. Is h is 0, it will alloc an unique id inside.
AddRecord(ctx context.Context, r []interface{}, h int64) (recordID int64, err error)

View File

@ -282,12 +282,12 @@ func (t *Table) FindIndexByColName(name string) *column.IndexedCol {
}
// Truncate implements table.Table Truncate interface.
func (t *Table) Truncate(ctx context.Context) error {
err := util.DelKeyWithPrefix(ctx, t.KeyPrefix())
func (t *Table) Truncate(rm kv.RetrieverMutator) error {
err := util.DelKeyWithPrefix(rm, t.KeyPrefix())
if err != nil {
return errors.Trace(err)
}
return util.DelKeyWithPrefix(ctx, t.IndexPrefix())
return util.DelKeyWithPrefix(rm, t.IndexPrefix())
}
// UpdateRecord implements table.Table UpdateRecord interface.

View File

@ -106,7 +106,7 @@ func (ts *testSuite) TestBasic(c *C) {
c.Assert(err, IsNil)
c.Assert(indexCnt(), Greater, 0)
// Make sure index data is also removed after tb.Truncate().
c.Assert(tb.Truncate(ctx), IsNil)
c.Assert(tb.Truncate(txn), IsNil)
c.Assert(indexCnt(), Equals, 0)
_, err = ts.se.Execute("drop table test.t")

View File

@ -22,13 +22,12 @@ import (
"strings"
"github.com/juju/errors"
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/kv"
)
// ScanMetaWithPrefix scans metadata with the prefix.
func ScanMetaWithPrefix(txn kv.Transaction, prefix string, filter func([]byte, []byte) bool) error {
iter, err := txn.Seek([]byte(prefix))
func ScanMetaWithPrefix(retriever kv.Retriever, prefix string, filter func([]byte, []byte) bool) error {
iter, err := retriever.Seek([]byte(prefix))
if err != nil {
return errors.Trace(err)
}
@ -56,14 +55,9 @@ func ScanMetaWithPrefix(txn kv.Transaction, prefix string, filter func([]byte, [
}
// DelKeyWithPrefix deletes keys with prefix.
func DelKeyWithPrefix(ctx context.Context, prefix string) error {
txn, err := ctx.GetTxn(false)
if err != nil {
return errors.Trace(err)
}
func DelKeyWithPrefix(rm kv.RetrieverMutator, prefix string) error {
var keys []string
iter, err := txn.Seek([]byte(prefix))
iter, err := rm.Seek([]byte(prefix))
if err != nil {
return errors.Trace(err)
}
@ -86,7 +80,7 @@ func DelKeyWithPrefix(ctx context.Context, prefix string) error {
}
for _, key := range keys {
err := txn.Delete([]byte(key))
err := rm.Delete([]byte(key))
if err != nil {
return errors.Trace(err)
}

View File

@ -120,12 +120,14 @@ func (c *MockContext) FinishTxn(rollback bool) error {
func (s *testPrefixSuite) TestPrefix(c *C) {
ctx := &MockContext{10000000, make(map[fmt.Stringer]interface{}), s.s, nil}
ctx.fillTxn()
err := DelKeyWithPrefix(ctx, string(encodeInt(ctx.prefix)))
txn, err := ctx.GetTxn(false)
c.Assert(err, IsNil)
err = DelKeyWithPrefix(txn, string(encodeInt(ctx.prefix)))
c.Assert(err, IsNil)
err = ctx.FinishTxn(false)
c.Assert(err, IsNil)
txn, err := s.s.Begin()
txn, err = s.s.Begin()
c.Assert(err, IsNil)
str := "key100jfowi878230"
err = txn.Set([]byte(str), []byte("val32dfaskli384757^*&%^"))