storage.lua 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. box.watch('box.status', function()
  2. if box.info.ro then
  3. return
  4. end
  5. -- ====================================
  6. -- key_value space
  7. -- ====================================
  8. box.schema.create_space('key_value', {
  9. format = {
  10. { name = 'key', type = 'string' },
  11. { name = 'bucket_id', type = 'unsigned' },
  12. { name = 'value', type = 'string' }
  13. },
  14. if_not_exists = true
  15. })
  16. -- create key_value space indexes
  17. box.space.key_value:create_index('id', {type = 'tree', parts = { 'key' }, unique = true, if_not_exists = true})
  18. box.space.key_value:create_index('bucket_id', { type = 'tree', parts = { 'bucket_id' }, unique = false, if_not_exists = true })
  19. -- ====================================
  20. -- filer_metadata space
  21. -- ====================================
  22. box.schema.create_space('filer_metadata', {
  23. format = {
  24. { name = 'directory', type = 'string' },
  25. { name = 'bucket_id', type = 'unsigned' },
  26. { name = 'name', type = 'string' },
  27. { name = 'expire_at', type = 'unsigned' },
  28. { name = 'data', type = 'string' }
  29. },
  30. if_not_exists = true
  31. })
  32. -- create filer_metadata space indexes
  33. box.space.filer_metadata:create_index('id', {type = 'tree', parts = { 'directory', 'name' }, unique = true, if_not_exists = true})
  34. box.space.filer_metadata:create_index('bucket_id', { type = 'tree', parts = { 'bucket_id' }, unique = false, if_not_exists = true })
  35. box.space.filer_metadata:create_index('directory_idx', { type = 'tree', parts = { 'directory' }, unique = false, if_not_exists = true })
  36. box.space.filer_metadata:create_index('name_idx', { type = 'tree', parts = { 'name' }, unique = false, if_not_exists = true })
  37. box.space.filer_metadata:create_index('expire_at_idx', { type = 'tree', parts = { 'expire_at' }, unique = false, if_not_exists = true})
  38. end)
  39. -- functions for filer_metadata space
  40. local filer_metadata = {
  41. delete_by_directory_idx = function(directory)
  42. local space = box.space.filer_metadata
  43. local index = space.index.directory_idx
  44. -- for each finded directories
  45. for _, tuple in index:pairs({ directory }, { iterator = 'EQ' }) do
  46. space:delete({ tuple[1], tuple[3] })
  47. end
  48. return true
  49. end,
  50. find_by_directory_idx_and_name = function(dirPath, startFileName, includeStartFile, limit)
  51. local space = box.space.filer_metadata
  52. local directory_idx = space.index.directory_idx
  53. -- choose filter name function
  54. local filter_filename_func
  55. if includeStartFile then
  56. filter_filename_func = function(value) return value >= startFileName end
  57. else
  58. filter_filename_func = function(value) return value > startFileName end
  59. end
  60. -- init results
  61. local results = {}
  62. -- for each finded directories
  63. for _, tuple in directory_idx:pairs({ dirPath }, { iterator = 'EQ' }) do
  64. -- filter by name
  65. if filter_filename_func(tuple[3]) then
  66. table.insert(results, tuple)
  67. end
  68. end
  69. -- sort
  70. table.sort(results, function(a, b) return a[3] < b[3] end)
  71. -- apply limit
  72. if #results > limit then
  73. local limitedResults = {}
  74. for i = 1, limit do
  75. table.insert(limitedResults, results[i])
  76. end
  77. results = limitedResults
  78. end
  79. -- return
  80. return results
  81. end,
  82. is_expired = function(args, tuple)
  83. return (tuple[4] > 0) and (require('fiber').time() > tuple[4])
  84. end
  85. }
  86. -- register functions for filer_metadata space, set grants
  87. rawset(_G, 'filer_metadata', filer_metadata)
  88. for name, _ in pairs(filer_metadata) do
  89. box.schema.func.create('filer_metadata.' .. name, { setuid = true, if_not_exists = true })
  90. box.schema.user.grant('storage', 'execute', 'function', 'filer_metadata.' .. name, { if_not_exists = true })
  91. end