SQL Server
SQL Server
Get the Number of Bytes Buffered on an SSH Channel
See more SSH Examples
Demonstrates the Chilkat Ssh.GetReceivedNumBytes method, which returns how many bytes are currently available in a channel's normal receive buffer. The only argument is the channel number. It returns -1 when the channel number is invalid or its retained resources have been released.
Background: This is a non-consuming look at how much is waiting, useful for deciding whether to retrieve now or keep reading, and for reporting progress on a large transfer. It counts only the normal receive buffer — bytes in the separate stderr buffer are excluded when
StderrToStdout is false. Note that data received earlier can remain available even after a disconnect, so a positive count does not imply the connection is still up.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- Demonstrates the Ssh.GetReceivedNumBytes method, which returns the number of bytes currently
-- available in a channel's normal receive buffer. The only argument is the channel number.
-- It returns -1 for an invalid channel or one whose resources have been released.
DECLARE @ssh int
EXEC @hr = sp_OACreate 'Chilkat.Ssh', @ssh OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
DECLARE @sshPort int
SELECT @sshPort = 22
EXEC sp_OAMethod @ssh, 'Connect', @success OUT, 'ssh.example.com', @sshPort
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Normally you would not hard-code the password in source. You should instead obtain it
-- from an interactive prompt, environment variable, or a secrets vault.
DECLARE @password nvarchar(4000)
SELECT @password = 'mySshPassword'
EXEC sp_OAMethod @ssh, 'AuthenticatePw', @success OUT, 'mySshLogin', @password
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
DECLARE @channelNum int
EXEC sp_OAMethod @ssh, 'OpenSessionChannel', @channelNum OUT
IF @channelNum < 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
EXEC sp_OAMethod @ssh, 'SendReqExec', @success OUT, @channelNum, 'ls -l /tmp'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- IMPORTANT: Set a read timeout. ReadTimeoutMs defaults to 0, which means no limit -- without
-- it, this call waits forever if the server never sends channel close.
EXEC sp_OASetProperty @ssh, 'ReadTimeoutMs', 15000
EXEC sp_OAMethod @ssh, 'ChannelReceiveToClose', @success OUT, @channelNum
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Find out how much is waiting before retrieving it.
DECLARE @numBytes int
EXEC sp_OAMethod @ssh, 'GetReceivedNumBytes', @numBytes OUT, @channelNum
IF @numBytes < 0
BEGIN
PRINT 'Invalid channel, or its resources were already released.'
EXEC @hr = sp_OADestroy @ssh
RETURN
END
PRINT 'Bytes available: ' + @numBytes
DECLARE @output nvarchar(4000)
EXEC sp_OAMethod @ssh, 'GetReceivedText', @output OUT, @channelNum, 'utf-8'
EXEC sp_OAGetProperty @ssh, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
PRINT @output
EXEC sp_OAMethod @ssh, 'Disconnect', NULL
EXEC @hr = sp_OADestroy @ssh
END
GO