diff --git a/coverage/coverage.out b/coverage/coverage.out index 16195ee..a72b65a 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -1,148 +1,4 @@ mode: set -github.com/echovault/echovault/internal/aof/log/store.go:46.60,47.34 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:47.34,49.3 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:52.61,53.34 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:53.34,55.3 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:58.67,59.34 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:59.34,61.3 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:64.63,65.34 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:65.34,67.3 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:70.77,71.34 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:71.34,73.3 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:76.80,83.39 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:83.40,83.41 0 0 -github.com/echovault/echovault/internal/aof/log/store.go:86.2,86.33 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:86.33,88.3 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:91.2,91.46 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:91.46,94.17 2 1 -github.com/echovault/echovault/internal/aof/log/store.go:94.17,96.4 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:97.3,98.17 2 1 -github.com/echovault/echovault/internal/aof/log/store.go:98.17,100.4 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:101.3,101.15 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:106.2,106.51 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:106.51,107.13 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:107.13,108.8 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:108.8,110.40 2 0 -github.com/echovault/echovault/internal/aof/log/store.go:110.40,113.11 3 0 -github.com/echovault/echovault/internal/aof/log/store.go:115.5,116.41 2 0 -github.com/echovault/echovault/internal/aof/log/store.go:121.2,121.19 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:124.55,126.21 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:126.21,128.3 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:130.2,135.47 4 1 -github.com/echovault/echovault/internal/aof/log/store.go:135.47,137.3 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:139.2,139.49 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:139.49,140.38 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:140.38,142.4 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:145.2,145.12 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:148.40,149.21 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:149.21,151.3 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:152.2,152.12 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:155.43,160.47 3 1 -github.com/echovault/echovault/internal/aof/log/store.go:160.47,162.3 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:164.2,165.6 2 1 -github.com/echovault/echovault/internal/aof/log/store.go:165.6,167.34 2 1 -github.com/echovault/echovault/internal/aof/log/store.go:167.34,169.4 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:170.3,170.13 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:170.13,172.9 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:174.3,175.17 2 1 -github.com/echovault/echovault/internal/aof/log/store.go:175.17,177.4 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:178.3,178.31 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:181.2,181.12 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:184.44,187.45 3 0 -github.com/echovault/echovault/internal/aof/log/store.go:187.45,189.3 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:191.2,191.47 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:191.47,193.3 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:194.2,194.12 1 0 -github.com/echovault/echovault/internal/aof/log/store.go:197.41,201.2 3 1 -github.com/echovault/echovault/internal/aof/engine.go:50.56,51.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:51.30,53.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:56.57,57.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:57.30,59.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:62.59,63.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:63.30,65.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:68.58,69.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:69.30,71.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:74.59,75.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:75.30,77.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:80.82,81.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:81.30,83.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:86.89,87.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:87.30,89.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:92.73,93.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:93.30,95.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:98.82,99.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:99.30,101.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:104.78,105.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:105.30,107.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:110.69,118.29 1 1 -github.com/echovault/echovault/internal/aof/engine.go:118.30,118.31 0 0 -github.com/echovault/echovault/internal/aof/engine.go:119.30,119.31 0 0 -github.com/echovault/echovault/internal/aof/engine.go:120.57,120.71 1 0 -github.com/echovault/echovault/internal/aof/engine.go:121.63,121.64 0 0 -github.com/echovault/echovault/internal/aof/engine.go:122.44,122.45 0 0 -github.com/echovault/echovault/internal/aof/engine.go:127.2,127.33 1 1 -github.com/echovault/echovault/internal/aof/engine.go:127.33,129.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:132.2,139.16 2 1 -github.com/echovault/echovault/internal/aof/engine.go:139.16,141.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:142.2,152.16 3 1 -github.com/echovault/echovault/internal/aof/engine.go:152.16,154.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:155.2,159.12 2 1 -github.com/echovault/echovault/internal/aof/engine.go:159.12,160.7 1 1 -github.com/echovault/echovault/internal/aof/engine.go:160.7,162.54 2 1 -github.com/echovault/echovault/internal/aof/engine.go:162.54,164.5 1 0 -github.com/echovault/echovault/internal/aof/engine.go:168.2,168.20 1 1 -github.com/echovault/echovault/internal/aof/engine.go:171.52,173.2 1 1 -github.com/echovault/echovault/internal/aof/engine.go:175.42,183.62 5 1 -github.com/echovault/echovault/internal/aof/engine.go:183.62,185.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:188.2,188.54 1 1 -github.com/echovault/echovault/internal/aof/engine.go:188.54,190.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:192.2,192.12 1 1 -github.com/echovault/echovault/internal/aof/engine.go:195.39,196.55 1 1 -github.com/echovault/echovault/internal/aof/engine.go:196.55,198.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:199.2,199.53 1 1 -github.com/echovault/echovault/internal/aof/engine.go:199.53,201.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:202.2,202.12 1 1 -github.com/echovault/echovault/internal/config/config.go:64.34,70.24 3 0 -github.com/echovault/echovault/internal/config/config.go:70.24,72.35 2 0 -github.com/echovault/echovault/internal/config/config.go:72.35,74.5 1 0 -github.com/echovault/echovault/internal/config/config.go:75.4,75.22 1 0 -github.com/echovault/echovault/internal/config/config.go:75.22,77.5 1 0 -github.com/echovault/echovault/internal/config/config.go:78.4,79.14 2 0 -github.com/echovault/echovault/internal/config/config.go:82.2,82.115 1 0 -github.com/echovault/echovault/internal/config/config.go:82.115,85.3 2 0 -github.com/echovault/echovault/internal/config/config.go:87.2,90.29 2 0 -github.com/echovault/echovault/internal/config/config.go:90.29,91.86 1 0 -github.com/echovault/echovault/internal/config/config.go:91.86,93.5 1 0 -github.com/echovault/echovault/internal/config/config.go:93.7,95.5 1 0 -github.com/echovault/echovault/internal/config/config.go:96.4,97.14 2 0 -github.com/echovault/echovault/internal/config/config.go:100.2,103.59 2 0 -github.com/echovault/echovault/internal/config/config.go:103.59,105.17 2 0 -github.com/echovault/echovault/internal/config/config.go:105.17,107.4 1 0 -github.com/echovault/echovault/internal/config/config.go:108.3,109.13 2 0 -github.com/echovault/echovault/internal/config/config.go:112.2,121.88 2 0 -github.com/echovault/echovault/internal/config/config.go:121.88,128.23 3 0 -github.com/echovault/echovault/internal/config/config.go:128.23,130.5 1 0 -github.com/echovault/echovault/internal/config/config.go:131.4,132.14 2 0 -github.com/echovault/echovault/internal/config/config.go:135.2,139.24 2 0 -github.com/echovault/echovault/internal/config/config.go:139.24,140.36 1 0 -github.com/echovault/echovault/internal/config/config.go:140.36,142.5 1 0 -github.com/echovault/echovault/internal/config/config.go:143.4,144.14 2 0 -github.com/echovault/echovault/internal/config/config.go:147.2,219.22 25 0 -github.com/echovault/echovault/internal/config/config.go:219.22,221.45 1 0 -github.com/echovault/echovault/internal/config/config.go:221.45,222.14 1 0 -github.com/echovault/echovault/internal/config/config.go:223.9,224.17 1 0 -github.com/echovault/echovault/internal/config/config.go:224.17,225.36 1 0 -github.com/echovault/echovault/internal/config/config.go:225.36,227.6 1 0 -github.com/echovault/echovault/internal/config/config.go:230.4,232.22 2 0 -github.com/echovault/echovault/internal/config/config.go:232.22,233.59 1 0 -github.com/echovault/echovault/internal/config/config.go:233.59,235.6 1 0 -github.com/echovault/echovault/internal/config/config.go:238.4,238.39 1 0 -github.com/echovault/echovault/internal/config/config.go:238.39,239.59 1 0 -github.com/echovault/echovault/internal/config/config.go:239.59,241.6 1 0 -github.com/echovault/echovault/internal/config/config.go:247.2,249.45 2 0 -github.com/echovault/echovault/internal/config/config.go:249.45,251.3 1 0 -github.com/echovault/echovault/internal/config/config.go:253.2,253.18 1 0 -github.com/echovault/echovault/internal/config/default.go:8.29,38.2 1 0 github.com/echovault/echovault/internal/aof/preamble/store.go:45.62,46.36 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:46.36,48.3 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:51.71,52.36 1 0 @@ -198,13 +54,102 @@ github.com/echovault/echovault/internal/aof/preamble/store.go:185.43,187.4 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:189.2,189.35 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:189.35,191.3 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:192.2,192.14 1 1 -github.com/echovault/echovault/internal/clock/clock.go:14.23,16.43 1 0 -github.com/echovault/echovault/internal/clock/clock.go:16.43,18.3 1 0 -github.com/echovault/echovault/internal/clock/clock.go:19.2,19.20 1 0 -github.com/echovault/echovault/internal/clock/clock.go:24.34,26.2 1 0 -github.com/echovault/echovault/internal/clock/clock.go:28.58,30.2 1 0 -github.com/echovault/echovault/internal/clock/clock.go:34.34,37.2 2 0 -github.com/echovault/echovault/internal/clock/clock.go:39.58,41.2 1 0 +github.com/echovault/echovault/internal/config/config.go:64.34,70.24 3 0 +github.com/echovault/echovault/internal/config/config.go:70.24,72.35 2 0 +github.com/echovault/echovault/internal/config/config.go:72.35,74.5 1 0 +github.com/echovault/echovault/internal/config/config.go:75.4,75.22 1 0 +github.com/echovault/echovault/internal/config/config.go:75.22,77.5 1 0 +github.com/echovault/echovault/internal/config/config.go:78.4,79.14 2 0 +github.com/echovault/echovault/internal/config/config.go:82.2,82.115 1 0 +github.com/echovault/echovault/internal/config/config.go:82.115,85.3 2 0 +github.com/echovault/echovault/internal/config/config.go:87.2,90.29 2 0 +github.com/echovault/echovault/internal/config/config.go:90.29,91.86 1 0 +github.com/echovault/echovault/internal/config/config.go:91.86,93.5 1 0 +github.com/echovault/echovault/internal/config/config.go:93.7,95.5 1 0 +github.com/echovault/echovault/internal/config/config.go:96.4,97.14 2 0 +github.com/echovault/echovault/internal/config/config.go:100.2,103.59 2 0 +github.com/echovault/echovault/internal/config/config.go:103.59,105.17 2 0 +github.com/echovault/echovault/internal/config/config.go:105.17,107.4 1 0 +github.com/echovault/echovault/internal/config/config.go:108.3,109.13 2 0 +github.com/echovault/echovault/internal/config/config.go:112.2,121.88 2 0 +github.com/echovault/echovault/internal/config/config.go:121.88,128.23 3 0 +github.com/echovault/echovault/internal/config/config.go:128.23,130.5 1 0 +github.com/echovault/echovault/internal/config/config.go:131.4,132.14 2 0 +github.com/echovault/echovault/internal/config/config.go:135.2,139.24 2 0 +github.com/echovault/echovault/internal/config/config.go:139.24,140.36 1 0 +github.com/echovault/echovault/internal/config/config.go:140.36,142.5 1 0 +github.com/echovault/echovault/internal/config/config.go:143.4,144.14 2 0 +github.com/echovault/echovault/internal/config/config.go:147.2,219.22 25 0 +github.com/echovault/echovault/internal/config/config.go:219.22,221.45 1 0 +github.com/echovault/echovault/internal/config/config.go:221.45,222.14 1 0 +github.com/echovault/echovault/internal/config/config.go:223.9,224.17 1 0 +github.com/echovault/echovault/internal/config/config.go:224.17,225.36 1 0 +github.com/echovault/echovault/internal/config/config.go:225.36,227.6 1 0 +github.com/echovault/echovault/internal/config/config.go:230.4,232.22 2 0 +github.com/echovault/echovault/internal/config/config.go:232.22,233.59 1 0 +github.com/echovault/echovault/internal/config/config.go:233.59,235.6 1 0 +github.com/echovault/echovault/internal/config/config.go:238.4,238.39 1 0 +github.com/echovault/echovault/internal/config/config.go:238.39,239.59 1 0 +github.com/echovault/echovault/internal/config/config.go:239.59,241.6 1 0 +github.com/echovault/echovault/internal/config/config.go:247.2,249.45 2 0 +github.com/echovault/echovault/internal/config/config.go:249.45,251.3 1 0 +github.com/echovault/echovault/internal/config/config.go:253.2,253.18 1 0 +github.com/echovault/echovault/internal/config/default.go:8.29,38.2 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:46.60,47.34 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:47.34,49.3 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:52.61,53.34 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:53.34,55.3 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:58.67,59.34 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:59.34,61.3 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:64.63,65.34 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:65.34,67.3 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:70.77,71.34 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:71.34,73.3 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:76.80,83.39 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:83.40,83.41 0 0 +github.com/echovault/echovault/internal/aof/log/store.go:86.2,86.33 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:86.33,88.3 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:91.2,91.46 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:91.46,94.17 2 1 +github.com/echovault/echovault/internal/aof/log/store.go:94.17,96.4 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:97.3,98.17 2 1 +github.com/echovault/echovault/internal/aof/log/store.go:98.17,100.4 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:101.3,101.15 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:106.2,106.51 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:106.51,107.13 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:107.13,108.8 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:108.8,110.40 2 1 +github.com/echovault/echovault/internal/aof/log/store.go:110.40,113.11 3 0 +github.com/echovault/echovault/internal/aof/log/store.go:115.5,116.41 2 1 +github.com/echovault/echovault/internal/aof/log/store.go:121.2,121.19 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:124.55,126.21 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:126.21,128.3 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:130.2,135.47 4 1 +github.com/echovault/echovault/internal/aof/log/store.go:135.47,137.3 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:139.2,139.49 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:139.49,140.38 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:140.38,142.4 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:145.2,145.12 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:148.40,149.21 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:149.21,151.3 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:152.2,152.12 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:155.43,160.47 3 1 +github.com/echovault/echovault/internal/aof/log/store.go:160.47,162.3 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:164.2,165.6 2 1 +github.com/echovault/echovault/internal/aof/log/store.go:165.6,167.34 2 1 +github.com/echovault/echovault/internal/aof/log/store.go:167.34,169.4 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:170.3,170.13 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:170.13,172.9 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:174.3,175.17 2 1 +github.com/echovault/echovault/internal/aof/log/store.go:175.17,177.4 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:178.3,178.31 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:181.2,181.12 1 1 +github.com/echovault/echovault/internal/aof/log/store.go:184.44,187.45 3 0 +github.com/echovault/echovault/internal/aof/log/store.go:187.45,189.3 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:191.2,191.47 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:191.47,193.3 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:194.2,194.12 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:197.41,201.2 3 1 github.com/echovault/echovault/internal/eviction/lfu.go:35.29,42.2 3 1 github.com/echovault/echovault/internal/eviction/lfu.go:44.34,46.2 1 1 github.com/echovault/echovault/internal/eviction/lfu.go:48.44,50.54 1 1 @@ -239,6 +184,54 @@ github.com/echovault/echovault/internal/eviction/lru.go:92.73,94.3 1 0 github.com/echovault/echovault/internal/eviction/lru.go:95.2,95.19 1 0 github.com/echovault/echovault/internal/eviction/lru.go:95.19,97.3 1 0 github.com/echovault/echovault/internal/eviction/lru.go:100.50,103.2 2 1 +github.com/echovault/echovault/internal/aof/engine.go:50.56,51.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:51.30,53.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:56.57,57.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:57.30,59.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:62.59,63.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:63.30,65.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:68.58,69.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:69.30,71.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:74.59,75.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:75.30,77.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:80.82,81.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:81.30,83.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:86.89,87.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:87.30,89.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:92.73,93.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:93.30,95.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:98.82,99.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:99.30,101.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:104.78,105.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:105.30,107.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:110.69,118.29 1 1 +github.com/echovault/echovault/internal/aof/engine.go:118.30,118.31 0 0 +github.com/echovault/echovault/internal/aof/engine.go:119.30,119.31 0 0 +github.com/echovault/echovault/internal/aof/engine.go:120.57,120.71 1 0 +github.com/echovault/echovault/internal/aof/engine.go:121.63,121.64 0 0 +github.com/echovault/echovault/internal/aof/engine.go:122.44,122.45 0 0 +github.com/echovault/echovault/internal/aof/engine.go:127.2,127.33 1 1 +github.com/echovault/echovault/internal/aof/engine.go:127.33,129.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:132.2,139.16 2 1 +github.com/echovault/echovault/internal/aof/engine.go:139.16,141.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:142.2,152.16 3 1 +github.com/echovault/echovault/internal/aof/engine.go:152.16,154.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:155.2,159.12 2 1 +github.com/echovault/echovault/internal/aof/engine.go:159.12,160.7 1 1 +github.com/echovault/echovault/internal/aof/engine.go:160.7,162.54 2 1 +github.com/echovault/echovault/internal/aof/engine.go:162.54,164.5 1 0 +github.com/echovault/echovault/internal/aof/engine.go:168.2,168.20 1 1 +github.com/echovault/echovault/internal/aof/engine.go:171.52,173.2 1 1 +github.com/echovault/echovault/internal/aof/engine.go:175.42,183.62 5 1 +github.com/echovault/echovault/internal/aof/engine.go:183.62,185.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:188.2,188.54 1 1 +github.com/echovault/echovault/internal/aof/engine.go:188.54,190.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:192.2,192.12 1 1 +github.com/echovault/echovault/internal/aof/engine.go:195.39,196.55 1 1 +github.com/echovault/echovault/internal/aof/engine.go:196.55,198.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:199.2,199.53 1 1 +github.com/echovault/echovault/internal/aof/engine.go:199.53,201.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:202.2,202.12 1 1 github.com/echovault/echovault/internal/modules/acl/acl.go:52.40,57.24 3 1 github.com/echovault/echovault/internal/modules/acl/acl.go:57.24,65.3 2 1 github.com/echovault/echovault/internal/modules/acl/acl.go:68.2,68.28 1 1 @@ -1408,7 +1401,7 @@ github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:64.10,66.5 1 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:67.4,68.31 2 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:68.31,73.20 1 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:73.20,75.6 1 0 -github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:77.4,77.46 1 1 +github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:76.5,76.47 1 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:78.9,80.47 1 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:80.47,85.20 1 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:85.20,87.6 1 0 @@ -1475,6 +1468,99 @@ github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:263.2,263.20 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:266.47,271.38 4 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:271.38,273.3 1 1 github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:275.2,275.17 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:27.78,33.29 4 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:33.29,34.54 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:34.54,40.42 4 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:40.42,42.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:44.4,47.12 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:50.3,50.36 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:50.36,57.43 5 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:57.43,59.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:61.4,63.21 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:67.2,69.25 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:72.76,76.35 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:76.35,77.65 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:77.65,78.41 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:78.41,80.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:81.4,81.12 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:83.3,83.13 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:86.2,86.51 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:89.75,90.29 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:91.9,96.36 4 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:96.36,97.66 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:97.66,98.52 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:98.52,102.6 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:103.5,103.13 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:105.4,106.14 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:108.3,109.26 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:111.9,115.56 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:115.56,117.4 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:118.3,118.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:118.53,122.37 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:122.37,123.67 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:123.67,124.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:124.53,125.59 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:125.59,129.8 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:131.6,131.14 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:133.5,133.54 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:133.54,136.6 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:138.9,138.61 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:138.61,142.37 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:142.37,143.67 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:143.67,144.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:144.53,146.24 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:146.24,149.8 2 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:151.6,151.14 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:153.5,153.33 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:153.33,156.6 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:158.9,158.60 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:158.60,162.37 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:162.37,163.67 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:163.67,164.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:164.53,165.55 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:165.55,169.8 3 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:171.6,171.14 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:173.5,173.50 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:173.50,176.6 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:178.9,180.4 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:181.3,182.26 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:183.10,184.54 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:188.75,190.2 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:192.36,200.84 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:200.84,204.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:213.84,217.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:225.86,229.7 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:238.86,242.7 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:252.86,256.7 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:267.84,271.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:272.73,273.49 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:273.49,275.6 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:276.5,276.45 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:285.84,289.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:290.73,292.18 2 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:292.18,294.6 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:295.5,295.53 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:304.84,308.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:309.73,310.47 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:310.47,312.6 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:313.5,313.45 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:321.84,325.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:335.86,339.7 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:340.75,341.34 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:341.34,343.8 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:344.7,345.34 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:345.34,347.8 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:348.7,348.75 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:348.75,350.8 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:351.7,351.47 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:361.86,365.7 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:366.75,367.35 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:367.35,369.8 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:370.7,371.47 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:380.86,384.7 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:385.75,388.38 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:388.38,390.8 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:391.7,391.30 1 1 github.com/echovault/echovault/internal/modules/set/commands.go:26.68,28.16 2 1 github.com/echovault/echovault/internal/modules/set/commands.go:28.16,30.3 1 0 github.com/echovault/echovault/internal/modules/set/commands.go:32.2,37.16 4 1 @@ -1767,99 +1853,6 @@ github.com/echovault/echovault/internal/modules/set/set.go:184.31,185.19 1 1 github.com/echovault/echovault/internal/modules/set/set.go:186.9,187.17 1 1 github.com/echovault/echovault/internal/modules/set/set.go:188.9,191.15 3 1 github.com/echovault/echovault/internal/modules/set/set.go:192.10,195.28 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:27.78,33.29 4 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:33.29,34.54 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:34.54,40.42 4 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:40.42,42.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:44.4,47.12 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:50.3,50.36 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:50.36,57.43 5 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:57.43,59.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:61.4,63.21 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:67.2,69.25 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:72.76,76.35 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:76.35,77.65 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:77.65,78.41 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:78.41,80.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:81.4,81.12 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:83.3,83.13 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:86.2,86.51 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:89.75,90.29 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:91.9,96.36 4 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:96.36,97.66 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:97.66,98.52 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:98.52,102.6 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:103.5,103.13 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:105.4,106.14 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:108.3,109.26 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:111.9,115.56 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:115.56,117.4 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:118.3,118.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:118.53,122.37 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:122.37,123.67 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:123.67,124.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:124.53,125.59 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:125.59,129.8 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:131.6,131.14 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:133.5,133.54 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:133.54,136.6 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:138.9,138.61 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:138.61,142.37 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:142.37,143.67 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:143.67,144.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:144.53,146.24 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:146.24,149.8 2 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:151.6,151.14 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:153.5,153.33 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:153.33,156.6 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:158.9,158.60 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:158.60,162.37 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:162.37,163.67 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:163.67,164.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:164.53,165.55 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:165.55,169.8 3 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:171.6,171.14 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:173.5,173.50 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:173.50,176.6 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:178.9,180.4 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:181.3,182.26 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:183.10,184.54 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:188.75,190.2 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:192.36,200.84 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:200.84,204.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:213.84,217.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:225.86,229.7 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:238.86,242.7 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:252.86,256.7 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:267.84,271.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:272.73,273.49 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:273.49,275.6 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:276.5,276.45 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:285.84,289.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:290.73,292.18 2 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:292.18,294.6 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:295.5,295.53 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:304.84,308.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:309.73,310.47 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:310.47,312.6 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:313.5,313.45 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:321.84,325.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:335.86,339.7 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:340.75,341.34 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:341.34,343.8 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:344.7,345.34 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:345.34,347.8 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:348.7,348.75 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:348.75,350.8 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:351.7,351.47 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:361.86,365.7 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:366.75,367.35 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:367.35,369.8 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:370.7,371.47 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:380.86,384.7 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:385.75,388.38 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:388.38,390.8 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:391.7,391.30 1 1 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:29.68,31.16 2 1 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:31.16,33.3 1 0 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:35.2,45.43 8 1 @@ -2921,70 +2914,71 @@ github.com/echovault/echovault/echovault/api_acl.go:364.10,365.31 1 0 github.com/echovault/echovault/echovault/api_acl.go:368.2,369.16 2 0 github.com/echovault/echovault/echovault/api_acl.go:369.16,371.3 1 0 github.com/echovault/echovault/echovault/api_acl.go:373.2,374.40 2 0 -github.com/echovault/echovault/echovault/api_acl.go:380.50,382.16 2 1 +github.com/echovault/echovault/echovault/api_acl.go:380.50,382.16 2 0 github.com/echovault/echovault/echovault/api_acl.go:382.16,384.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:385.2,386.40 2 1 -github.com/echovault/echovault/echovault/api_admin.go:142.84,145.9 2 0 -github.com/echovault/echovault/echovault/api_admin.go:146.28,147.71 1 0 -github.com/echovault/echovault/echovault/api_admin.go:148.29,149.73 1 0 -github.com/echovault/echovault/echovault/api_admin.go:150.28,151.71 1 0 -github.com/echovault/echovault/echovault/api_admin.go:154.2,155.16 2 0 -github.com/echovault/echovault/echovault/api_admin.go:155.16,157.3 1 0 -github.com/echovault/echovault/echovault/api_admin.go:159.2,159.45 1 0 -github.com/echovault/echovault/echovault/api_admin.go:165.54,167.16 2 0 -github.com/echovault/echovault/echovault/api_admin.go:167.16,169.3 1 0 -github.com/echovault/echovault/echovault/api_admin.go:170.2,170.41 1 0 -github.com/echovault/echovault/echovault/api_admin.go:174.49,176.16 2 0 -github.com/echovault/echovault/echovault/api_admin.go:176.16,178.3 1 0 -github.com/echovault/echovault/echovault/api_admin.go:179.2,179.40 1 0 -github.com/echovault/echovault/echovault/api_admin.go:183.50,185.16 2 0 -github.com/echovault/echovault/echovault/api_admin.go:185.16,187.3 1 0 -github.com/echovault/echovault/echovault/api_admin.go:188.2,188.41 1 0 -github.com/echovault/echovault/echovault/api_admin.go:192.55,194.16 2 0 -github.com/echovault/echovault/echovault/api_admin.go:194.16,196.3 1 0 -github.com/echovault/echovault/echovault/api_admin.go:197.2,197.40 1 0 -github.com/echovault/echovault/echovault/api_admin.go:209.67,213.36 3 1 -github.com/echovault/echovault/echovault/api_admin.go:213.36,214.52 1 1 -github.com/echovault/echovault/echovault/api_admin.go:214.52,216.4 1 0 -github.com/echovault/echovault/echovault/api_admin.go:219.2,219.63 1 1 -github.com/echovault/echovault/echovault/api_admin.go:219.63,224.32 1 1 -github.com/echovault/echovault/echovault/api_admin.go:224.32,227.44 2 1 -github.com/echovault/echovault/echovault/api_admin.go:227.44,229.6 1 0 -github.com/echovault/echovault/echovault/api_admin.go:230.5,230.16 1 1 -github.com/echovault/echovault/echovault/api_admin.go:234.111,236.19 2 0 -github.com/echovault/echovault/echovault/api_admin.go:236.19,238.6 1 0 -github.com/echovault/echovault/echovault/api_admin.go:239.5,243.11 1 0 -github.com/echovault/echovault/echovault/api_admin.go:245.94,253.5 1 1 -github.com/echovault/echovault/echovault/api_admin.go:255.3,255.13 1 1 -github.com/echovault/echovault/echovault/api_admin.go:259.2,262.31 1 1 -github.com/echovault/echovault/echovault/api_admin.go:262.31,265.43 2 1 -github.com/echovault/echovault/echovault/api_admin.go:265.43,267.5 1 0 -github.com/echovault/echovault/echovault/api_admin.go:268.4,268.15 1 1 -github.com/echovault/echovault/echovault/api_admin.go:272.83,274.4 1 0 -github.com/echovault/echovault/echovault/api_admin.go:275.71,275.90 1 0 -github.com/echovault/echovault/echovault/api_admin.go:279.2,279.40 1 1 -github.com/echovault/echovault/echovault/api_admin.go:279.40,281.92 1 1 -github.com/echovault/echovault/echovault/api_admin.go:281.92,283.4 1 1 -github.com/echovault/echovault/echovault/api_admin.go:283.6,284.12 1 0 -github.com/echovault/echovault/echovault/api_admin.go:286.3,289.32 1 1 -github.com/echovault/echovault/echovault/api_admin.go:289.32,292.39 2 1 -github.com/echovault/echovault/echovault/api_admin.go:292.39,294.6 1 0 -github.com/echovault/echovault/echovault/api_admin.go:295.5,295.16 1 1 -github.com/echovault/echovault/echovault/api_admin.go:299.111,301.19 2 0 -github.com/echovault/echovault/echovault/api_admin.go:301.19,303.6 1 0 -github.com/echovault/echovault/echovault/api_admin.go:304.5,308.11 1 0 -github.com/echovault/echovault/echovault/api_admin.go:310.94,318.5 1 1 -github.com/echovault/echovault/echovault/api_admin.go:322.2,324.12 2 1 -github.com/echovault/echovault/echovault/api_admin.go:350.76,352.2 1 1 -github.com/echovault/echovault/echovault/api_admin.go:368.59,372.22 3 1 -github.com/echovault/echovault/echovault/api_admin.go:373.9,375.86 1 1 -github.com/echovault/echovault/echovault/api_admin.go:375.86,377.4 1 1 -github.com/echovault/echovault/echovault/api_admin.go:378.9,380.45 1 1 -github.com/echovault/echovault/echovault/api_admin.go:380.45,381.66 1 1 -github.com/echovault/echovault/echovault/api_admin.go:381.66,382.13 1 1 -github.com/echovault/echovault/echovault/api_admin.go:384.4,384.88 1 1 -github.com/echovault/echovault/echovault/api_admin.go:384.88,385.122 1 1 -github.com/echovault/echovault/echovault/api_admin.go:385.122,387.6 1 1 +github.com/echovault/echovault/echovault/api_acl.go:385.2,386.40 2 0 +github.com/echovault/echovault/echovault/api_admin.go:142.87,145.22 2 1 +github.com/echovault/echovault/echovault/api_admin.go:145.22,146.10 1 1 +github.com/echovault/echovault/echovault/api_admin.go:147.32,148.75 1 1 +github.com/echovault/echovault/echovault/api_admin.go:149.33,150.77 1 1 +github.com/echovault/echovault/echovault/api_admin.go:151.32,152.75 1 1 +github.com/echovault/echovault/echovault/api_admin.go:156.2,157.16 2 1 +github.com/echovault/echovault/echovault/api_admin.go:157.16,159.3 1 0 +github.com/echovault/echovault/echovault/api_admin.go:161.2,161.45 1 1 +github.com/echovault/echovault/echovault/api_admin.go:167.54,169.16 2 1 +github.com/echovault/echovault/echovault/api_admin.go:169.16,171.3 1 0 +github.com/echovault/echovault/echovault/api_admin.go:172.2,172.41 1 1 +github.com/echovault/echovault/echovault/api_admin.go:179.47,181.16 2 1 +github.com/echovault/echovault/echovault/api_admin.go:181.16,183.3 1 0 +github.com/echovault/echovault/echovault/api_admin.go:184.2,185.42 2 1 +github.com/echovault/echovault/echovault/api_admin.go:189.50,191.16 2 1 +github.com/echovault/echovault/echovault/api_admin.go:191.16,193.3 1 0 +github.com/echovault/echovault/echovault/api_admin.go:194.2,194.41 1 1 +github.com/echovault/echovault/echovault/api_admin.go:198.55,200.16 2 0 +github.com/echovault/echovault/echovault/api_admin.go:200.16,202.3 1 0 +github.com/echovault/echovault/echovault/api_admin.go:203.2,203.40 1 0 +github.com/echovault/echovault/echovault/api_admin.go:215.67,219.36 3 1 +github.com/echovault/echovault/echovault/api_admin.go:219.36,220.52 1 1 +github.com/echovault/echovault/echovault/api_admin.go:220.52,222.4 1 0 +github.com/echovault/echovault/echovault/api_admin.go:225.2,225.63 1 1 +github.com/echovault/echovault/echovault/api_admin.go:225.63,230.32 1 1 +github.com/echovault/echovault/echovault/api_admin.go:230.32,233.44 2 1 +github.com/echovault/echovault/echovault/api_admin.go:233.44,235.6 1 0 +github.com/echovault/echovault/echovault/api_admin.go:236.5,236.16 1 1 +github.com/echovault/echovault/echovault/api_admin.go:240.111,242.19 2 0 +github.com/echovault/echovault/echovault/api_admin.go:242.19,244.6 1 0 +github.com/echovault/echovault/echovault/api_admin.go:245.5,249.11 1 0 +github.com/echovault/echovault/echovault/api_admin.go:251.94,259.5 1 1 +github.com/echovault/echovault/echovault/api_admin.go:261.3,261.13 1 1 +github.com/echovault/echovault/echovault/api_admin.go:265.2,268.31 1 1 +github.com/echovault/echovault/echovault/api_admin.go:268.31,271.43 2 1 +github.com/echovault/echovault/echovault/api_admin.go:271.43,273.5 1 0 +github.com/echovault/echovault/echovault/api_admin.go:274.4,274.15 1 1 +github.com/echovault/echovault/echovault/api_admin.go:278.83,280.4 1 0 +github.com/echovault/echovault/echovault/api_admin.go:281.71,281.90 1 0 +github.com/echovault/echovault/echovault/api_admin.go:285.2,285.40 1 1 +github.com/echovault/echovault/echovault/api_admin.go:285.40,287.92 1 1 +github.com/echovault/echovault/echovault/api_admin.go:287.92,289.4 1 1 +github.com/echovault/echovault/echovault/api_admin.go:289.6,290.12 1 0 +github.com/echovault/echovault/echovault/api_admin.go:292.3,295.32 1 1 +github.com/echovault/echovault/echovault/api_admin.go:295.32,298.39 2 1 +github.com/echovault/echovault/echovault/api_admin.go:298.39,300.6 1 0 +github.com/echovault/echovault/echovault/api_admin.go:301.5,301.16 1 1 +github.com/echovault/echovault/echovault/api_admin.go:305.111,307.19 2 0 +github.com/echovault/echovault/echovault/api_admin.go:307.19,309.6 1 0 +github.com/echovault/echovault/echovault/api_admin.go:310.5,314.11 1 0 +github.com/echovault/echovault/echovault/api_admin.go:316.94,324.5 1 1 +github.com/echovault/echovault/echovault/api_admin.go:328.2,330.12 2 1 +github.com/echovault/echovault/echovault/api_admin.go:356.76,358.2 1 1 +github.com/echovault/echovault/echovault/api_admin.go:374.59,378.22 3 1 +github.com/echovault/echovault/echovault/api_admin.go:379.9,381.86 1 1 +github.com/echovault/echovault/echovault/api_admin.go:381.86,383.4 1 1 +github.com/echovault/echovault/echovault/api_admin.go:384.9,386.45 1 1 +github.com/echovault/echovault/echovault/api_admin.go:386.45,387.66 1 1 +github.com/echovault/echovault/echovault/api_admin.go:387.66,388.13 1 1 +github.com/echovault/echovault/echovault/api_admin.go:390.4,390.88 1 1 +github.com/echovault/echovault/echovault/api_admin.go:390.88,391.122 1 1 +github.com/echovault/echovault/echovault/api_admin.go:391.122,393.6 1 1 github.com/echovault/echovault/echovault/api_generic.go:88.91,91.9 2 1 github.com/echovault/echovault/echovault/api_generic.go:92.18,93.26 1 1 github.com/echovault/echovault/echovault/api_generic.go:94.18,95.26 1 1 @@ -3075,9 +3069,9 @@ github.com/echovault/echovault/echovault/api_hash.go:79.36,81.3 1 1 github.com/echovault/echovault/echovault/api_hash.go:83.2,84.16 2 1 github.com/echovault/echovault/echovault/api_hash.go:84.16,86.3 1 0 github.com/echovault/echovault/echovault/api_hash.go:88.2,88.41 1 1 -github.com/echovault/echovault/echovault/api_hash.go:104.79,112.16 2 0 -github.com/echovault/echovault/echovault/api_hash.go:112.16,114.3 1 0 -github.com/echovault/echovault/echovault/api_hash.go:115.2,115.45 1 0 +github.com/echovault/echovault/echovault/api_hash.go:104.79,112.16 2 1 +github.com/echovault/echovault/echovault/api_hash.go:112.16,114.3 1 1 +github.com/echovault/echovault/echovault/api_hash.go:115.2,115.45 1 1 github.com/echovault/echovault/echovault/api_hash.go:132.79,136.16 3 1 github.com/echovault/echovault/echovault/api_hash.go:136.16,138.3 1 1 github.com/echovault/echovault/echovault/api_hash.go:140.2,140.46 1 1 @@ -3152,54 +3146,56 @@ github.com/echovault/echovault/echovault/api_list.go:294.2,294.41 1 1 github.com/echovault/echovault/echovault/api_list.go:310.76,313.16 3 1 github.com/echovault/echovault/echovault/api_list.go:313.16,315.3 1 1 github.com/echovault/echovault/echovault/api_list.go:316.2,316.41 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:50.86,52.24 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:52.24,54.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:57.2,59.36 3 0 -github.com/echovault/echovault/echovault/api_pubsub.go:59.36,65.3 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:68.2,69.12 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:69.12,71.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:73.2,73.25 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:73.25,78.33 4 0 -github.com/echovault/echovault/echovault/api_pubsub.go:78.33,80.4 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:82.3,82.13 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:93.70,94.24 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:94.24,96.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:98.2,98.36 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:98.36,100.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:102.2,103.115 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:116.87,118.24 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:118.24,120.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:123.2,125.36 3 0 -github.com/echovault/echovault/echovault/api_pubsub.go:125.36,131.3 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:134.2,135.12 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:135.12,137.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:139.2,139.25 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:139.25,144.33 4 0 -github.com/echovault/echovault/echovault/api_pubsub.go:144.33,146.4 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:148.3,148.13 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:159.71,160.24 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:160.24,162.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:164.2,164.36 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:164.36,166.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:168.2,169.115 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:182.73,184.16 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:184.16,186.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:187.2,188.40 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:198.75,200.19 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:200.19,202.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:203.2,204.16 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:204.16,206.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:207.2,207.45 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:213.54,215.16 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:215.16,217.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:218.2,218.41 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:228.82,232.16 3 0 -github.com/echovault/echovault/echovault/api_pubsub.go:232.16,234.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:236.2,238.16 3 0 -github.com/echovault/echovault/echovault/api_pubsub.go:238.16,240.3 1 0 -github.com/echovault/echovault/echovault/api_pubsub.go:242.2,245.28 3 0 -github.com/echovault/echovault/echovault/api_pubsub.go:245.28,248.3 2 0 -github.com/echovault/echovault/echovault/api_pubsub.go:250.2,250.20 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:50.86,52.24 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:52.24,54.3 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:56.2,58.36 3 1 +github.com/echovault/echovault/echovault/api_pubsub.go:58.36,65.3 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:65.8,69.3 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:72.2,73.12 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:73.12,75.3 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:77.2,77.25 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:77.25,82.33 4 1 +github.com/echovault/echovault/echovault/api_pubsub.go:82.33,84.4 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:86.3,86.13 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:97.70,98.24 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:98.24,100.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:102.2,102.36 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:102.36,104.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:106.2,107.115 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:120.87,122.24 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:122.24,124.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:126.2,128.36 3 1 +github.com/echovault/echovault/echovault/api_pubsub.go:128.36,135.3 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:135.8,139.3 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:142.2,143.12 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:143.12,145.3 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:147.2,147.25 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:147.25,152.33 4 1 +github.com/echovault/echovault/echovault/api_pubsub.go:152.33,154.4 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:156.3,156.13 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:167.71,168.24 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:168.24,170.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:172.2,172.36 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:172.36,174.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:176.2,177.115 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:190.73,192.16 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:192.16,194.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:195.2,196.40 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:206.75,208.19 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:208.19,210.3 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:211.2,212.16 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:212.16,214.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:215.2,215.45 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:221.54,223.16 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:223.16,225.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:226.2,226.41 1 1 +github.com/echovault/echovault/echovault/api_pubsub.go:236.83,240.16 3 1 +github.com/echovault/echovault/echovault/api_pubsub.go:240.16,242.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:244.2,246.16 3 1 +github.com/echovault/echovault/echovault/api_pubsub.go:246.16,248.3 1 0 +github.com/echovault/echovault/echovault/api_pubsub.go:250.2,253.28 3 1 +github.com/echovault/echovault/echovault/api_pubsub.go:253.28,256.3 2 1 +github.com/echovault/echovault/echovault/api_pubsub.go:258.2,258.20 1 1 github.com/echovault/echovault/echovault/api_set.go:36.75,39.16 3 1 github.com/echovault/echovault/echovault/api_set.go:39.16,41.3 1 1 github.com/echovault/echovault/echovault/api_set.go:42.2,42.41 1 1 @@ -3500,7 +3496,7 @@ github.com/echovault/echovault/echovault/echovault.go:176.42,178.3 1 1 github.com/echovault/echovault/echovault/echovault.go:181.2,182.40 2 1 github.com/echovault/echovault/echovault/echovault.go:182.40,184.3 1 1 github.com/echovault/echovault/echovault/echovault.go:187.2,188.43 2 1 -github.com/echovault/echovault/echovault/echovault.go:188.43,190.3 1 0 +github.com/echovault/echovault/echovault/echovault.go:188.43,190.3 1 1 github.com/echovault/echovault/echovault/echovault.go:192.2,192.29 1 1 github.com/echovault/echovault/echovault/echovault.go:192.29,202.38 1 1 github.com/echovault/echovault/echovault/echovault.go:202.38,206.5 3 0 @@ -3510,10 +3506,10 @@ github.com/echovault/echovault/echovault/echovault.go:210.46,212.7 1 0 github.com/echovault/echovault/echovault/echovault.go:214.5,214.17 1 0 github.com/echovault/echovault/echovault/echovault.go:217.3,225.5 1 1 github.com/echovault/echovault/echovault/echovault.go:226.8,237.65 1 1 -github.com/echovault/echovault/echovault/echovault.go:237.65,239.44 2 0 +github.com/echovault/echovault/echovault/echovault.go:237.65,239.44 2 1 github.com/echovault/echovault/echovault/echovault.go:239.44,240.46 1 0 github.com/echovault/echovault/echovault/echovault.go:240.46,242.7 1 0 -github.com/echovault/echovault/echovault/echovault.go:244.5,244.17 1 0 +github.com/echovault/echovault/echovault/echovault.go:244.5,244.17 1 1 github.com/echovault/echovault/echovault/echovault.go:246.72,248.93 2 0 github.com/echovault/echovault/echovault/echovault.go:248.93,250.6 1 0 github.com/echovault/echovault/echovault/echovault.go:251.5,251.56 1 0 @@ -3601,20 +3597,20 @@ github.com/echovault/echovault/echovault/echovault.go:477.4,477.27 1 0 github.com/echovault/echovault/echovault/echovault.go:481.2,481.37 1 0 github.com/echovault/echovault/echovault/echovault.go:481.37,483.3 1 0 github.com/echovault/echovault/echovault/echovault.go:491.34,493.2 1 1 -github.com/echovault/echovault/echovault/echovault.go:496.47,497.38 1 0 +github.com/echovault/echovault/echovault/echovault.go:496.47,497.38 1 1 github.com/echovault/echovault/echovault/echovault.go:497.38,499.3 1 0 -github.com/echovault/echovault/echovault/echovault.go:501.2,501.12 1 0 -github.com/echovault/echovault/echovault/echovault.go:501.12,502.27 1 0 +github.com/echovault/echovault/echovault/echovault.go:501.2,501.12 1 1 +github.com/echovault/echovault/echovault/echovault.go:501.12,502.27 1 1 github.com/echovault/echovault/echovault/echovault.go:502.27,504.53 1 0 github.com/echovault/echovault/echovault/echovault.go:504.53,506.5 1 0 github.com/echovault/echovault/echovault/echovault.go:507.4,507.10 1 0 -github.com/echovault/echovault/echovault/echovault.go:510.3,510.62 1 0 +github.com/echovault/echovault/echovault/echovault.go:510.3,510.62 1 1 github.com/echovault/echovault/echovault/echovault.go:510.62,512.4 1 0 -github.com/echovault/echovault/echovault/echovault.go:515.2,515.12 1 0 -github.com/echovault/echovault/echovault/echovault.go:518.42,520.2 1 0 -github.com/echovault/echovault/echovault/echovault.go:522.43,524.2 1 0 -github.com/echovault/echovault/echovault/echovault.go:526.56,528.2 1 0 -github.com/echovault/echovault/echovault/echovault.go:531.56,533.2 1 0 +github.com/echovault/echovault/echovault/echovault.go:515.2,515.12 1 1 +github.com/echovault/echovault/echovault/echovault.go:518.42,520.2 1 1 +github.com/echovault/echovault/echovault/echovault.go:522.43,524.2 1 1 +github.com/echovault/echovault/echovault/echovault.go:526.56,528.2 1 1 +github.com/echovault/echovault/echovault/echovault.go:531.56,533.2 1 1 github.com/echovault/echovault/echovault/echovault.go:535.44,537.2 1 0 github.com/echovault/echovault/echovault/echovault.go:539.45,541.2 1 0 github.com/echovault/echovault/echovault/echovault.go:544.45,545.40 1 0 @@ -3674,12 +3670,12 @@ github.com/echovault/echovault/echovault/keyspace.go:181.2,181.9 1 1 github.com/echovault/echovault/echovault/keyspace.go:182.108,183.36 1 0 github.com/echovault/echovault/echovault/keyspace.go:184.108,185.36 1 0 github.com/echovault/echovault/echovault/keyspace.go:188.2,190.12 2 1 -github.com/echovault/echovault/echovault/keyspace.go:193.60,195.6 1 0 -github.com/echovault/echovault/echovault/keyspace.go:195.6,196.83 1 0 -github.com/echovault/echovault/echovault/keyspace.go:196.83,198.9 2 0 -github.com/echovault/echovault/echovault/keyspace.go:201.2,202.33 2 0 +github.com/echovault/echovault/echovault/keyspace.go:193.60,195.6 1 1 +github.com/echovault/echovault/echovault/keyspace.go:195.6,196.83 1 1 +github.com/echovault/echovault/echovault/keyspace.go:196.83,198.9 2 1 +github.com/echovault/echovault/echovault/keyspace.go:201.2,202.33 2 1 github.com/echovault/echovault/echovault/keyspace.go:202.33,204.3 1 0 -github.com/echovault/echovault/echovault/keyspace.go:205.2,206.13 2 0 +github.com/echovault/echovault/echovault/keyspace.go:205.2,206.13 2 1 github.com/echovault/echovault/echovault/keyspace.go:211.86,212.27 1 1 github.com/echovault/echovault/echovault/keyspace.go:212.27,214.84 1 1 github.com/echovault/echovault/echovault/keyspace.go:214.84,216.4 1 1 diff --git a/echovault/api_acl_test.go b/echovault/api_acl_test.go index 0763f93..47bf427 100644 --- a/echovault/api_acl_test.go +++ b/echovault/api_acl_test.go @@ -266,13 +266,4 @@ func TestEchoVault_ACLUsers(t *testing.T) { if len(list) != 2 { t.Errorf("ACLList() got list length %d, want %d", len(list), 2) } - - // Save the current ACL rules - ok, err = server.ACLSave() - if err != nil { - t.Errorf("ACLSave() err = %v", err) - } - if !ok { - t.Errorf("ACLSave() could not save ACL file") - } } diff --git a/echovault/api_admin.go b/echovault/api_admin.go index 5ae2305..7f070e6 100644 --- a/echovault/api_admin.go +++ b/echovault/api_admin.go @@ -139,16 +139,18 @@ type SubCommandOptions struct { // `options` - CommandListOptions. // // Returns: a string slice of all the loaded commands. SubCommands are represented as "command|subcommand". -func (server *EchoVault) CommandList(options CommandListOptions) ([]string, error) { +func (server *EchoVault) CommandList(options ...CommandListOptions) ([]string, error) { cmd := []string{"COMMAND", "LIST"} - switch { - case options.ACLCAT != "": - cmd = append(cmd, []string{"FILTERBY", "ACLCAT", options.ACLCAT}...) - case options.PATTERN != "": - cmd = append(cmd, []string{"FILTERBY", "PATTERN", options.PATTERN}...) - case options.MODULE != "": - cmd = append(cmd, []string{"FILTERBY", "MODULE", options.MODULE}...) + if len(options) > 0 { + switch { + case options[0].ACLCAT != "": + cmd = append(cmd, []string{"FILTERBY", "ACLCAT", options[0].ACLCAT}...) + case options[0].PATTERN != "": + cmd = append(cmd, []string{"FILTERBY", "PATTERN", options[0].PATTERN}...) + case options[0].MODULE != "": + cmd = append(cmd, []string{"FILTERBY", "MODULE", options[0].MODULE}...) + } } b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true) @@ -171,12 +173,16 @@ func (server *EchoVault) CommandCount() (int, error) { } // Save triggers a new snapshot. -func (server *EchoVault) Save() (string, error) { +// +// Returns: true if the save was started. The OK response does not confirm that the save was successfully synced to +// file. Only that the background process has started. +func (server *EchoVault) Save() (bool, error) { b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SAVE"}), nil, false, true) if err != nil { - return "", err + return false, err } - return internal.ParseStringResponse(b) + res, err := internal.ParseStringResponse(b) + return strings.EqualFold(res, "ok"), err } // LastSave returns the unix epoch milliseconds timestamp of the last save. diff --git a/echovault/api_admin_test.go b/echovault/api_admin_test.go index 76b4d3a..749abc3 100644 --- a/echovault/api_admin_test.go +++ b/echovault/api_admin_test.go @@ -18,13 +18,17 @@ import ( "bytes" "errors" "fmt" + "github.com/echovault/echovault/internal/clock" "github.com/echovault/echovault/internal/constants" "github.com/tidwall/resp" "os" "path" + "reflect" "slices" "strconv" + "strings" "testing" + "time" ) func TestEchoVault_AddCommand(t *testing.T) { @@ -373,3 +377,192 @@ func TestEchoVault_Plugins(t *testing.T) { } } } + +func TestEchoVault_CommandList(t *testing.T) { + server := createEchoVault() + + tests := []struct { + name string + options interface{} + want []string + wantErr bool + }{ + { + name: "1. Get all present commands when no options are passed", + options: nil, + want: func() []string { + var commands []string + for _, command := range server.commands { + if command.SubCommands == nil || len(command.SubCommands) == 0 { + commands = append(commands, strings.ToLower(command.Command)) + continue + } + for _, subcommand := range command.SubCommands { + commands = append(commands, strings.ToLower(fmt.Sprintf("%s %s", command.Command, subcommand.Command))) + } + } + return commands + }(), + wantErr: false, + }, + { + name: "2. Get commands filtered by hash ACL category", + options: CommandListOptions{ACLCAT: constants.HashCategory}, + want: func() []string { + var commands []string + for _, command := range server.commands { + if slices.Contains(command.Categories, constants.HashCategory) { + commands = append(commands, strings.ToLower(command.Command)) + } + } + return commands + }(), + wantErr: false, + }, + { + name: "3. Get commands filtered by pattern", + options: CommandListOptions{PATTERN: "z*"}, + want: func() []string { + var commands []string + for _, command := range server.commands { + if strings.EqualFold(command.Module, constants.SortedSetModule) { + commands = append(commands, strings.ToLower(command.Command)) + } + } + return commands + }(), + wantErr: false, + }, + { + name: "4. Get commands filtered by module", + options: CommandListOptions{MODULE: constants.ListModule}, + want: func() []string { + var commands []string + for _, command := range server.commands { + if strings.EqualFold(command.Module, constants.ListModule) { + commands = append(commands, strings.ToLower(command.Command)) + } + } + return commands + }(), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var got []string + var err error + if tt.options == nil { + got, err = server.CommandList() + } else { + got, err = server.CommandList(tt.options.(CommandListOptions)) + } + if (err != nil) != tt.wantErr { + t.Errorf("CommandList() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("CommandList() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_CommandCount(t *testing.T) { + server := createEchoVault() + + tests := []struct { + name string + want int + wantErr bool + }{ + { + name: "1. Get the count of all commands/subcommands on the server", + want: func() int { + var commands []string + for _, command := range server.commands { + if command.SubCommands == nil || len(command.SubCommands) == 0 { + commands = append(commands, strings.ToLower(command.Command)) + continue + } + for _, subcommand := range command.SubCommands { + commands = append(commands, strings.ToLower(fmt.Sprintf("%s %s", command.Command, subcommand.Command))) + } + } + return len(commands) + }(), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := server.CommandCount() + if (err != nil) != tt.wantErr { + t.Errorf("CommandCount() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("CommandCount() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_Save(t *testing.T) { + conf := DefaultConfig() + conf.DataDir = path.Join(".", "testdata", "data") + server := createEchoVaultWithConfig(conf) + + tests := []struct { + name string + want bool + wantErr bool + }{ + { + name: "1. Return true response when save process is started", + want: true, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := server.Save() + if (err != nil) != tt.wantErr { + t.Errorf("Save() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("Save() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_LastSave(t *testing.T) { + server := createEchoVault() + server.setLatestSnapshot(clock.NewClock().Now().Add(5 * time.Minute).UnixMilli()) + + tests := []struct { + name string + want int + wantErr bool + }{ + { + name: "1. Get latest snapshot time milliseconds", + want: int(clock.NewClock().Now().Add(5 * time.Minute).UnixMilli()), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := server.LastSave() + if (err != nil) != tt.wantErr { + t.Errorf("LastSave() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("LastSave() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/echovault/api_hash_test.go b/echovault/api_hash_test.go index 00f49ad..7f18e01 100644 --- a/echovault/api_hash_test.go +++ b/echovault/api_hash_test.go @@ -770,3 +770,59 @@ func TestEchoVault_HVALS(t *testing.T) { }) } } + +func TestEchoVault_HGet(t *testing.T) { + server := createEchoVault() + tests := []struct { + name string + presetValue interface{} + key string + fields []string + want []string + wantErr bool + }{ + { + name: "1. Get values from existing hash.", + key: "HgetKey1", + presetValue: map[string]interface{}{"field1": "value1", "field2": 365, "field3": 3.142}, + fields: []string{"field1", "field2", "field3", "field4"}, + want: []string{"value1", "365", "3.142", ""}, + wantErr: false, + }, + { + name: "2. Return empty slice when attempting to get from non-existed key", + presetValue: nil, + key: "HgetKey2", + fields: []string{"field1"}, + want: []string{}, + wantErr: false, + }, + { + name: "3. Error when trying to get from a value that is not a hash map", + presetValue: "Default Value", + key: "HgetKey3", + fields: []string{"field1"}, + want: nil, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValue != nil { + err := presetValue(server, context.Background(), tt.key, tt.presetValue) + if err != nil { + t.Error(err) + return + } + } + got, err := server.HGet(tt.key, tt.fields...) + if (err != nil) != tt.wantErr { + t.Errorf("HGet() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("HGet() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/echovault/api_pubsub.go b/echovault/api_pubsub.go index 7240835..4212920 100644 --- a/echovault/api_pubsub.go +++ b/echovault/api_pubsub.go @@ -53,15 +53,19 @@ func (server *EchoVault) Subscribe(tag string, channels ...string) ReadPubSubMes connections = make(map[string]conn) } - // If connection with this name does not exist, create new connection it var readConn net.Conn var writeConn net.Conn if _, ok := connections[tag]; !ok { + // If connection with this name does not exist, create new connection readConn, writeConn = net.Pipe() connections[tag] = conn{ readConn: &readConn, writeConn: &writeConn, } + } else { + // Reuse existing connection + readConn = *connections[tag].readConn + writeConn = *connections[tag].writeConn } // Subscribe connection to the provided channels @@ -119,15 +123,19 @@ func (server *EchoVault) PSubscribe(tag string, patterns ...string) ReadPubSubMe connections = make(map[string]conn) } - // If connection with this name does not exist, create new connection it var readConn net.Conn var writeConn net.Conn if _, ok := connections[tag]; !ok { + // If connection with this name does not exist, create new connection. readConn, writeConn = net.Pipe() connections[tag] = conn{ readConn: &readConn, writeConn: &writeConn, } + } else { + // Reuse existing connection. + readConn = *connections[tag].readConn + writeConn = *connections[tag].writeConn } // Subscribe connection to the provided channels @@ -218,14 +226,14 @@ func (server *EchoVault) PubSubNumPat() (int, error) { return internal.ParseIntegerResponse(b) } -// PubSubNmSub returns the number of subscribers for each of the specified channels. +// PubSubNumSub returns the number of subscribers for each of the specified channels. // // Parameters: // // `channels` - ...string - The list of channels whose number of subscribers is to be checked. // // Returns: A map of map[string]int where the key is the channel name and the value is the number of subscribers. -func (server *EchoVault) PubSubNmSub(channels ...string) (map[string]int, error) { +func (server *EchoVault) PubSubNumSub(channels ...string) (map[string]int, error) { cmd := append([]string{"PUBSUB", "NUMSUB"}, channels...) b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true) diff --git a/echovault/api_pubsub_test.go b/echovault/api_pubsub_test.go index afd234a..282c6cc 100644 --- a/echovault/api_pubsub_test.go +++ b/echovault/api_pubsub_test.go @@ -13,3 +13,253 @@ // limitations under the License. package echovault + +import ( + "fmt" + "reflect" + "slices" + "testing" +) + +func Test_Subscribe(t *testing.T) { + server := createEchoVault() + + // Subscribe to channels. + tag := "tag" + channels := []string{"channel1", "channel2"} + readMessage := server.Subscribe(tag, channels...) + for i := 0; i < len(channels); i++ { + message := readMessage() + // Check that we've received the subscribe messages. + if message[0] != "subscribe" { + t.Errorf("SUBSCRIBE() expected index 0 for message at %d to be \"subscribe\", got %s", i, message[0]) + } + if !slices.Contains(channels, message[1]) { + t.Errorf("SUBSCRIBE() unexpected string \"%s\" at index 1 for message %d", message[1], i) + } + } + + // Publish some messages to the channels. + for _, channel := range channels { + ok, err := server.Publish(channel, fmt.Sprintf("message for %s", channel)) + if err != nil { + t.Errorf("PUBLISH() err = %v", err) + } + if !ok { + t.Errorf("PUBLISH() could not publish message to channel %s", channel) + } + } + + // Read messages from the channels + for i := 0; i < len(channels); i++ { + message := readMessage() + // Check that we've received the messages. + if message[0] != "message" { + t.Errorf("SUBSCRIBE() expected index 0 for message at %d to be \"message\", got %s", i, message[0]) + } + if !slices.Contains(channels, message[1]) { + t.Errorf("SUBSCRIBE() unexpected string \"%s\" at index 1 for message %d", message[1], i) + } + if !slices.Contains([]string{"message for channel1", "message for channel2"}, message[2]) { + t.Errorf("SUBSCRIBE() unexpected string \"%s\" at index 1 for message %d", message[1], i) + } + } + + // Unsubscribe from channels + server.Unsubscribe(tag, channels...) +} + +func TestEchoVault_PSubscribe(t *testing.T) { + server := createEchoVault() + + // Subscribe to channels. + tag := "tag" + patterns := []string{"channel[12]", "pattern[12]"} + readMessage := server.PSubscribe(tag, patterns...) + for i := 0; i < len(patterns); i++ { + message := readMessage() + // Check that we've received the subscribe messages. + if message[0] != "psubscribe" { + t.Errorf("PSUBSCRIBE() expected index 0 for message at %d to be \"psubscribe\", got %s", i, message[0]) + } + if !slices.Contains(patterns, message[1]) { + t.Errorf("PSUBSCRIBE() unexpected string \"%s\" at index 1 for message %d", message[1], i) + } + } + + // Publish some messages to the channels. + for _, channel := range []string{"channel1", "channel2", "pattern1", "pattern2"} { + ok, err := server.Publish(channel, fmt.Sprintf("message for %s", channel)) + if err != nil { + t.Errorf("PUBLISH() err = %v", err) + } + if !ok { + t.Errorf("PUBLISH() could not publish message to channel %s", channel) + } + } + + // Read messages from the channels + for i := 0; i < len(patterns)*2; i++ { + message := readMessage() + // Check that we've received the messages. + if message[0] != "message" { + t.Errorf("SUBSCRIBE() expected index 0 for message at %d to be \"message\", got %s", i, message[0]) + } + if !slices.Contains(patterns, message[1]) { + t.Errorf("SUBSCRIBE() unexpected string \"%s\" at index 1 for message %d", message[1], i) + } + if !slices.Contains([]string{ + "message for channel1", "message for channel2", "message for pattern1", "message for pattern2"}, message[2]) { + t.Errorf("SUBSCRIBE() unexpected string \"%s\" at index 1 for message %d", message[2], i) + } + } + + // Unsubscribe from channels + server.PUnsubscribe(tag, patterns...) +} + +func TestEchoVault_PubSubChannels(t *testing.T) { + server := createEchoVault() + tests := []struct { + name string + tag string + channels []string + patterns []string + pattern string + want []string + wantErr bool + }{ + { + name: "1. Get number of active channels", + tag: "tag", + channels: []string{"channel1", "channel2", "channel3", "channel4"}, + patterns: []string{"channel[56]"}, + pattern: "channel[123456]", + want: []string{"channel1", "channel2", "channel3", "channel4"}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Subscribe to channels + readChannelMessages := server.Subscribe(tt.tag, tt.channels...) + for i := 0; i < len(tt.channels); i++ { + readChannelMessages() + } + // Subscribe to patterns + readPatternMessages := server.PSubscribe(tt.tag, tt.patterns...) + for i := 0; i < len(tt.patterns); i++ { + readPatternMessages() + } + got, err := server.PubSubChannels(tt.pattern) + if (err != nil) != tt.wantErr { + t.Errorf("PubSubChannels() error = %v, wantErr %v", err, tt.wantErr) + return + } + if len(got) != len(tt.want) { + t.Errorf("PubSubChannels() got response length %d, want %d", len(got), len(tt.want)) + } + for _, item := range got { + if !slices.Contains(tt.want, item) { + t.Errorf("PubSubChannels() unexpected item \"%s\", in response", item) + } + } + }) + } +} + +func TestEchoVault_PubSubNumPat(t *testing.T) { + server := createEchoVault() + tests := []struct { + name string + tag string + patterns []string + want int + wantErr bool + }{ + { + name: "1. Get number of active patterns on the server", + tag: "tag", + patterns: []string{"channel[56]", "channel[78]"}, + want: 2, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Subscribe to patterns + readPatternMessages := server.PSubscribe(tt.tag, tt.patterns...) + for i := 0; i < len(tt.patterns); i++ { + readPatternMessages() + } + got, err := server.PubSubNumPat() + if (err != nil) != tt.wantErr { + t.Errorf("PubSubNumPat() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("PubSubNumPat() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_PubSubNumSub(t *testing.T) { + server := createEchoVault() + tests := []struct { + name string + subscriptions map[string]struct { + channels []string + patterns []string + } + channels []string + want map[string]int + wantErr bool + }{ + { + name: "Get number of subscriptions for the given channels", + subscriptions: map[string]struct { + channels []string + patterns []string + }{ + "tag1": { + channels: []string{"channel1", "channel2"}, + patterns: []string{"channel[34]"}, + }, + "tag2": { + channels: []string{"channel2", "channel3"}, + patterns: []string{"channel[23]"}, + }, + "tag3": { + channels: []string{"channel2", "channel4"}, + patterns: []string{}, + }, + }, + channels: []string{"channel1", "channel2", "channel3", "channel4", "channel5"}, + want: map[string]int{"channel1": 1, "channel2": 3, "channel3": 1, "channel4": 1, "channel5": 0}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for tag, subs := range tt.subscriptions { + readPat := server.PSubscribe(tag, subs.patterns...) + for _, _ = range subs.patterns { + readPat() + } + readChan := server.Subscribe(tag, subs.channels...) + for _, _ = range subs.channels { + readChan() + } + } + got, err := server.PubSubNumSub(tt.channels...) + if (err != nil) != tt.wantErr { + t.Errorf("PubSubNumSub() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("PubSubNumSub() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/internal/clock/clock_test.go b/internal/clock/clock_test.go deleted file mode 100644 index ec6b61b..0000000 --- a/internal/clock/clock_test.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2024 Kelvin Clement Mwinuka -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package clock diff --git a/internal/modules/pubsub/pubsub.go b/internal/modules/pubsub/pubsub.go index 36d09df..f7cbcf2 100644 --- a/internal/modules/pubsub/pubsub.go +++ b/internal/modules/pubsub/pubsub.go @@ -73,8 +73,8 @@ func (ps *PubSub) Subscribe(_ context.Context, conn *net.Conn, channels []string }); err != nil { log.Println(err) } + ps.channels = append(ps.channels, newChan) } - ps.channels = append(ps.channels, newChan) } else { // Subscribe to existing channel if ps.channels[channelIdx].Subscribe(conn) { diff --git a/internal/raft/raft.go b/internal/raft/raft.go index b900fe2..8b6670a 100644 --- a/internal/raft/raft.go +++ b/internal/raft/raft.go @@ -172,10 +172,10 @@ func (r *Raft) HasJoinedCluster() bool { } func (r *Raft) AddVoter( - id raft.ServerID, - address raft.ServerAddress, - prevIndex uint64, - timeout time.Duration, + id raft.ServerID, + address raft.ServerAddress, + prevIndex uint64, + timeout time.Duration, ) error { if r.IsRaftLeader() { raftConfig := r.raft.GetConfiguration()