+build go1.10

package ocsql

import (
	
	
	
)

var errConnDone = sql.ErrConnDone
Compile time assertion
WrapConnector allows wrapping a database driver.Connector which eliminates the need to register ocsql as an available driver.Driver.
func ( driver.Connector,  ...TraceOption) driver.Connector {
	 := TraceOptions{}
	for ,  := range  {
		(&)
	}

	return &ocDriver{
		parent:    .Driver(),
		connector: ,
		options:   ,
	}
}
ocDriver implements driver.Driver
type ocDriver struct {
	parent    driver.Driver
	connector driver.Connector
	options   TraceOptions
}

func ( driver.Driver,  TraceOptions) driver.Driver {
	if ,  := .(driver.DriverContext);  {
		return ocDriver{parent: , options: }
	}
	return struct{ driver.Driver }{ocDriver{parent: , options: }}
}

func ( driver.Conn,  TraceOptions) driver.Conn {
	var (
		,  = .(driver.NamedValueChecker)
		,   = .(driver.SessionResetter)
	)
	 := &ocConn{parent: , options: }
	switch {
	case ! && !:
		return 
	case  && !:
		return struct {
			conn
			driver.NamedValueChecker
		}{, }
	case ! && :
		return struct {
			conn
			driver.SessionResetter
		}{, }
	case  && :
		return struct {
			conn
			driver.NamedValueChecker
			driver.SessionResetter
		}{, , }
	}
	panic("unreachable")
}

func ( driver.Stmt,  string,  TraceOptions) driver.Stmt {
	var (
		,     = .(driver.StmtExecContext)
		,     = .(driver.StmtQueryContext)
		,    = .(driver.ColumnConverter)
		,  = .(driver.NamedValueChecker)
	)

	 := ocStmt{parent: , query: , options: }
	switch {
	case ! && ! && ! && !:
		return struct {
			driver.Stmt
		}{}
	case ! &&  && ! && !:
		return struct {
			driver.Stmt
			driver.StmtQueryContext
		}{, }
	case  && ! && ! && !:
		return struct {
			driver.Stmt
			driver.StmtExecContext
		}{, }
	case  &&  && ! && !:
		return struct {
			driver.Stmt
			driver.StmtExecContext
			driver.StmtQueryContext
		}{, , }
	case ! && ! &&  && !:
		return struct {
			driver.Stmt
			driver.ColumnConverter
		}{, }
	case ! &&  &&  && !:
		return struct {
			driver.Stmt
			driver.StmtQueryContext
			driver.ColumnConverter
		}{, , }
	case  && ! &&  && !:
		return struct {
			driver.Stmt
			driver.StmtExecContext
			driver.ColumnConverter
		}{, , }
	case  &&  &&  && !:
		return struct {
			driver.Stmt
			driver.StmtExecContext
			driver.StmtQueryContext
			driver.ColumnConverter
		}{, , , }

	case ! && ! && ! && :
		return struct {
			driver.Stmt
			driver.NamedValueChecker
		}{, }
	case ! &&  && ! && :
		return struct {
			driver.Stmt
			driver.StmtQueryContext
			driver.NamedValueChecker
		}{, , }
	case  && ! && ! && :
		return struct {
			driver.Stmt
			driver.StmtExecContext
			driver.NamedValueChecker
		}{, , }
	case  &&  && ! && :
		return struct {
			driver.Stmt
			driver.StmtExecContext
			driver.StmtQueryContext
			driver.NamedValueChecker
		}{, , , }
	case ! && ! &&  && :
		return struct {
			driver.Stmt
			driver.ColumnConverter
			driver.NamedValueChecker
		}{, , }
	case ! &&  &&  && :
		return struct {
			driver.Stmt
			driver.StmtQueryContext
			driver.ColumnConverter
			driver.NamedValueChecker
		}{, , , }
	case  && ! &&  && :
		return struct {
			driver.Stmt
			driver.StmtExecContext
			driver.ColumnConverter
			driver.NamedValueChecker
		}{, , , }
	case  &&  &&  && :
		return struct {
			driver.Stmt
			driver.StmtExecContext
			driver.StmtQueryContext
			driver.ColumnConverter
			driver.NamedValueChecker
		}{, , , , }
	}
	panic("unreachable")
}

func ( ocDriver) ( string) (driver.Connector, error) {
	var  error
	.connector,  = .parent.(driver.DriverContext).OpenConnector()
	if  != nil {
		return nil, 
	}
	return , 
}

func ( ocDriver) ( context.Context) (driver.Conn, error) {
	,  := .connector.Connect()
	if  != nil {
		return nil, 
	}
	return &ocConn{parent: , options: .options}, nil
}

func ( ocDriver) () driver.Driver {
	return