90 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
package mssql
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/binary"
 | 
						|
)
 | 
						|
 | 
						|
type procId struct {
 | 
						|
	id   uint16
 | 
						|
	name string
 | 
						|
}
 | 
						|
 | 
						|
// parameter flags
 | 
						|
const (
 | 
						|
	fByRevValue   = 1
 | 
						|
	fDefaultValue = 2
 | 
						|
)
 | 
						|
 | 
						|
type param struct {
 | 
						|
	Name   string
 | 
						|
	Flags  uint8
 | 
						|
	ti     typeInfo
 | 
						|
	buffer []byte
 | 
						|
}
 | 
						|
 | 
						|
const (
 | 
						|
	fWithRecomp    = 1
 | 
						|
	fNoMetaData    = 2
 | 
						|
	fReuseMetaData = 4
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	sp_Cursor          = procId{1, ""}
 | 
						|
	sp_CursorOpen      = procId{2, ""}
 | 
						|
	sp_CursorPrepare   = procId{3, ""}
 | 
						|
	sp_CursorExecute   = procId{4, ""}
 | 
						|
	sp_CursorPrepExec  = procId{5, ""}
 | 
						|
	sp_CursorUnprepare = procId{6, ""}
 | 
						|
	sp_CursorFetch     = procId{7, ""}
 | 
						|
	sp_CursorOption    = procId{8, ""}
 | 
						|
	sp_CursorClose     = procId{9, ""}
 | 
						|
	sp_ExecuteSql      = procId{10, ""}
 | 
						|
	sp_Prepare         = procId{11, ""}
 | 
						|
	sp_PrepExec        = procId{13, ""}
 | 
						|
	sp_PrepExecRpc     = procId{14, ""}
 | 
						|
	sp_Unprepare       = procId{15, ""}
 | 
						|
)
 | 
						|
 | 
						|
// http://msdn.microsoft.com/en-us/library/dd357576.aspx
 | 
						|
func sendRpc(buf *tdsBuffer, headers []headerStruct, proc procId, flags uint16, params []param, resetSession bool) (err error) {
 | 
						|
	buf.BeginPacket(packRPCRequest, resetSession)
 | 
						|
	writeAllHeaders(buf, headers)
 | 
						|
	if len(proc.name) == 0 {
 | 
						|
		var idswitch uint16 = 0xffff
 | 
						|
		err = binary.Write(buf, binary.LittleEndian, &idswitch)
 | 
						|
		if err != nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
		err = binary.Write(buf, binary.LittleEndian, &proc.id)
 | 
						|
		if err != nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		err = writeUsVarChar(buf, proc.name)
 | 
						|
		if err != nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
	}
 | 
						|
	err = binary.Write(buf, binary.LittleEndian, &flags)
 | 
						|
	if err != nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	for _, param := range params {
 | 
						|
		if err = writeBVarChar(buf, param.Name); err != nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
		if err = binary.Write(buf, binary.LittleEndian, param.Flags); err != nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
		err = writeTypeInfo(buf, ¶m.ti)
 | 
						|
		if err != nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
		err = param.ti.Writer(buf, param.ti, param.buffer)
 | 
						|
		if err != nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return buf.FinishPacket()
 | 
						|
}
 |