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()
- }
|