package schema

import (
	
	
	

	
	
)

type Dialect interface {
	Init(db *sql.DB)

	Name() dialect.Name
	Features() feature.Feature

	Tables() *Tables
	OnTable(table *Table)

	IdentQuote() byte
	Append(fmter Formatter, b []byte, v interface{}) []byte
	Appender(typ reflect.Type) AppenderFunc
	FieldAppender(field *Field) AppenderFunc
	Scanner(typ reflect.Type) ScannerFunc
}

//------------------------------------------------------------------------------

type nopDialect struct {
	tables   *Tables
	features feature.Feature

	appenderMap sync.Map
	scannerMap  sync.Map
}

func () *nopDialect {
	 := new(nopDialect)
	.tables = NewTables()
	.features = feature.Returning
	return 
}

func ( *nopDialect) (*sql.DB) {}

func ( *nopDialect) () dialect.Name {
	return dialect.Invalid
}

func ( *nopDialect) () feature.Feature {
	return .features
}

func ( *nopDialect) () *Tables {
	return .tables
}

func ( *nopDialect) ( *Field) {}

func ( *nopDialect) ( *Table) {}

func ( *nopDialect) () byte {
	return '"'
}

func ( *nopDialect) ( Formatter,  []byte,  interface{}) []byte {
	return Append(, , , nil)
}

func ( *nopDialect) ( reflect.Type) AppenderFunc {
	if ,  := .appenderMap.Load();  {
		return .(AppenderFunc)
	}

	 := Appender(, nil)

	if ,  := .appenderMap.LoadOrStore(, );  {
		return .(AppenderFunc)
	}
	return 
}

func ( *nopDialect) ( *Field) AppenderFunc {
	return FieldAppender(, )
}

func ( *nopDialect) ( reflect.Type) ScannerFunc {
	if ,  := .scannerMap.Load();  {
		return .(ScannerFunc)
	}

	 := Scanner()

	if ,  := .scannerMap.LoadOrStore(, );  {
		return .(ScannerFunc)
	}
	return 
}