PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/Kilimanjaro_Trunk/DialogPool/Scripts/2 - Dialog pool setup.sql

#
SQL | 173 lines | 109 code | 21 blank | 43 comment | 0 complexity | 2c1f75fd46ad2f5ee8067e780f461cd0 MD5 | raw file
  1. --------------------------------------------------------------------
  2. -- Script for dialog pool sample.
  3. --
  4. -- This file is part of the Microsoft SQL Server Code Samples.
  5. -- Copyright (C) Microsoft Corporation. All Rights reserved.
  6. -- This source code is intended only as a supplement to Microsoft
  7. -- Development Tools and/or on-line documentation. See these other
  8. -- materials for detailed information regarding Microsoft code samples.
  9. --
  10. -- THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
  11. -- ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  12. -- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  13. -- PARTICULAR PURPOSE.
  14. --------------------------------------------------------------------
  15. --------------------------------------------------------------------------
  16. -- Dialog pool setup.
  17. --------------------------------------------------------------------------
  18. USE SsbDemoDb;
  19. GO
  20. --------------------------------------------------------------------------
  21. -- The dialog pool table.
  22. -- Obtain a conversation handle using from service, to service, and contract.
  23. -- Also indicates age and usage of dialog for auditing purposes.
  24. --------------------------------------------------------------------------
  25. IF EXISTS (SELECT name FROM sys.tables WHERE name = 'DialogPool')
  26. DROP TABLE DialogPool;
  27. GO
  28. CREATE TABLE DialogPool (
  29. FromService SYSNAME NOT NULL,
  30. ToService SYSNAME NOT NULL,
  31. OnContract SYSNAME NOT NULL,
  32. Handle UNIQUEIDENTIFIER NOT NULL,
  33. OwnerSPID INT NOT NULL,
  34. CreationTime DATETIME NOT NULL,
  35. SendCount BIGINT NOT NULL,
  36. UNIQUE (Handle));
  37. GO
  38. --------------------------------------------------------------------------
  39. -- Get dialog procedure.
  40. -- Reuse a free dialog in the pool or create a new one in case
  41. -- no free dialogs exist.
  42. -- Input is from service, to service, and contract.
  43. -- Output is dialog handle and count of message previously sent on dialog.
  44. --------------------------------------------------------------------------
  45. IF EXISTS (SELECT name FROM sys.procedures WHERE name = 'usp_get_dialog')
  46. DROP PROC usp_get_dialog;
  47. GO
  48. CREATE PROCEDURE usp_get_dialog (
  49. @fromService SYSNAME,
  50. @toService SYSNAME,
  51. @onContract SYSNAME,
  52. @dialogHandle UNIQUEIDENTIFIER OUTPUT,
  53. @sendCount BIGINT OUTPUT)
  54. AS
  55. BEGIN
  56. SET NOCOUNT ON;
  57. DECLARE @dialog TABLE
  58. (
  59. FromService SYSNAME NOT NULL,
  60. ToService SYSNAME NOT NULL,
  61. OnContract SYSNAME NOT NULL,
  62. Handle UNIQUEIDENTIFIER NOT NULL,
  63. OwnerSPID INT NOT NULL,
  64. CreationTime DATETIME NOT NULL,
  65. SendCount BIGINT NOT NULL
  66. );
  67. -- Try to claim an unused dialog in DialogPool
  68. -- READPAST option avoids blocking on locked dialogs.
  69. BEGIN TRANSACTION;
  70. DELETE @dialog;
  71. UPDATE TOP(1) DialogPool WITH(READPAST)
  72. SET OwnerSPID = @@SPID
  73. OUTPUT INSERTED.* INTO @dialog
  74. WHERE FromService = @fromService
  75. AND ToService = @toService
  76. AND OnContract = @OnContract
  77. AND OwnerSPID = -1;
  78. IF @@ROWCOUNT > 0
  79. BEGIN
  80. SET @dialogHandle = (SELECT Handle FROM @dialog);
  81. SET @sendCount = (SELECT SendCount FROM @dialog);
  82. END
  83. ELSE
  84. BEGIN
  85. -- No free dialogs: need to create a new one
  86. BEGIN DIALOG CONVERSATION @dialogHandle
  87. FROM SERVICE @fromService
  88. TO SERVICE @toService
  89. ON CONTRACT @onContract
  90. WITH ENCRYPTION = OFF;
  91. INSERT INTO DialogPool
  92. (FromService, ToService, OnContract, Handle, OwnerSPID,
  93. CreationTime, SendCount)
  94. VALUES
  95. (@fromService, @toService, @onContract, @dialogHandle, @@SPID,
  96. GETDATE(), 0);
  97. SET @sendCount = 0;
  98. END
  99. COMMIT;
  100. END;
  101. GO
  102. --------------------------------------------------------------------------
  103. -- Free dialog procedure.
  104. -- Return the dialog to the pool.
  105. -- Inputs are dialog handle and updated send count.
  106. --------------------------------------------------------------------------
  107. IF EXISTS (SELECT name FROM sys.procedures WHERE name = 'usp_free_dialog')
  108. DROP PROC usp_free_dialog;
  109. GO
  110. CREATE PROCEDURE usp_free_dialog (
  111. @dialogHandle UNIQUEIDENTIFIER,
  112. @sendCount BIGINT)
  113. AS
  114. BEGIN
  115. SET NOCOUNT ON;
  116. DECLARE @rowcount INT;
  117. DECLARE @string VARCHAR(50);
  118. BEGIN TRANSACTION;
  119. -- Release dialog by setting OwnerSPID to -1.
  120. UPDATE [DialogPool] SET OwnerSPID = -1, SendCount = @sendCount WHERE Handle = @dialogHandle;
  121. SELECT @rowcount = @@ROWCOUNT;
  122. IF @rowcount = 0
  123. BEGIN
  124. SET @string = (SELECT CAST( @dialogHandle AS VARCHAR(50)));
  125. RAISERROR('usp_free_dialog: dialog %s not found in dialog pool', 16, 1, @string) WITH LOG;
  126. END
  127. ELSE IF @rowcount > 1
  128. BEGIN
  129. SET @string = (SELECT CAST( @dialogHandle AS VARCHAR(50)));
  130. RAISERROR('usp_free_dialog: duplicate dialog %s found in dialog pool', 16, 1, @string) WITH LOG;
  131. END
  132. COMMIT;
  133. END;
  134. GO
  135. --------------------------------------------------------------------------
  136. -- Delete dialog procedure.
  137. -- Delete the dialog from the pool. This does not end the dialog.
  138. -- Input is dialog handle.
  139. --------------------------------------------------------------------------
  140. IF EXISTS (SELECT name FROM sys.procedures WHERE name = 'usp_delete_dialog')
  141. DROP PROC usp_delete_dialog;
  142. GO
  143. CREATE PROCEDURE usp_delete_dialog (
  144. @dialogHandle UNIQUEIDENTIFIER)
  145. AS
  146. BEGIN
  147. SET NOCOUNT ON;
  148. BEGIN TRANSACTION;
  149. DELETE [DialogPool] WHERE Handle = @dialogHandle;
  150. COMMIT;
  151. END;
  152. GO