Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
1.8 KiB
89 lines
1.8 KiB
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() |
|
}
|
|
|