Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. DELIMITER $$
  2. CREATE PROCEDURE vpn_assign_nodes(IN node __NODENAME_T__, IN node_count INT)
  3. BEGIN
  4. DROP TABLE IF EXISTS vpn_assign_tmp;
  5. DROP TABLE IF EXISTS vpn_row_tmp;
  6.  
  7. CREATE TEMPORARY TABLE vpn_assign_tmp
  8. SELECT * FROM vpn_pool WHERE 0;
  9. CREATE TEMPORARY TABLE vpn_row_tmp
  10. SELECT
  11. vpn_pool.vpn_id, vpn_pool.vpn_type, vpn_pool.vpn_data,
  12. prov.semaphore_needed, prov.semaphore_count
  13. FROM vpn_pool JOIN vpn_provider_common AS prov
  14. ON vpn_pool.vpn_type = prov.vpn_type
  15. WHERE 0;
  16.  
  17. SET @nodes_needed = node_count;
  18. SET @done = 0;
  19. WHILE (@nodes_needed > 0 AND @done != 1) DO
  20.  
  21. START TRANSACTION;
  22.  
  23. INSERT INTO vpn_row_tmp (
  24. SELECT
  25. vpn_pool.vpn_id, vpn_pool.vpn_type, vpn_pool.vpn_data,
  26. prov.semaphore_needed, prov.semaphore_count
  27. FROM vpn_pool JOIN vpn_provider_common AS prov
  28. ON vpn_pool.vpn_type = prov.vpn_type
  29. WHERE
  30. vpn_pool.vpn_node IS NULL
  31. AND (prov.semaphore_needed > 0 AND
  32. prov.semaphore_count < prov.semaphore_needed)
  33. OR prov.semaphore_needed = 0
  34. ORDER BY RAND()
  35. LIMIT 1
  36. FOR UPDATE);
  37.  
  38. IF (ROW_COUNT() < 1) THEN
  39. SET @done = 1;
  40. ELSE
  41. SET @my_id := (SELECT vpn_id FROM vpn_row_tmp LIMIT 1);
  42. INSERT INTO vpn_assign_tmp (vpn_node, vpn_id, vpn_type, vpn_data)
  43. SELECT node, @my_id, vpn_type, vpn_data FROM vpn_row_tmp LIMIT 1;
  44.  
  45. UPDATE vpn_pool
  46. JOIN vpn_provider_common prov
  47. ON vpn_pool.vpn_type = prov.vpn_type
  48. SET vpn_pool.vpn_node = node,
  49. vpn_pool.vpn_conn_id = CONNECTION_ID(),
  50. prov.semaphore_count = prov.semaphore_count + 1
  51. WHERE vpn_id = @my_id;
  52.  
  53. SET @nodes_needed = @nodes_needed - 1;
  54. DELETE FROM vpn_row_tmp;
  55. END IF;
  56.  
  57. COMMIT;
  58. END WHILE;
  59. SELECT vpn_id, vpn_type, vpn_node, vpn_data FROM vpn_assign_tmp;
  60. END $$
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement