| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 | package mssqlimport (	"encoding/binary")type ProcId struct {	id   uint16	name string}// parameter flagsconst (	fByRevValue   = 1	fDefaultValue = 2)type Param struct {	Name   string	Flags  uint8	ti     typeInfo	buffer []byte}func MakeProcId(name string) (res ProcId) {	res.name = name	if len(name) == 0 {		panic("Proc name shouln't be empty")	}	if len(name) >= 0xffff {		panic("Invalid length of procedure name, should be less than 0xffff")	}	return res}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.aspxfunc sendRpc(buf *tdsBuffer, headers []headerStruct, proc ProcId, flags uint16, params []Param) (err error) {	buf.BeginPacket(packRPCRequest)	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()}
 |