| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 | 
							- 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
 
- }
 
- 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.aspx
 
- func 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()
 
- }
 
 
  |