mirror of
https://github.com/EchoVault/SugarDB.git
synced 2025-10-05 07:56:52 +08:00
Moved some types into internal folder as they will do not need to be exported. Changed GetState method to getState to make it private to the echovault package
This commit is contained in:
@@ -20,7 +20,6 @@ import (
|
|||||||
"github.com/echovault/echovault/internal/config"
|
"github.com/echovault/echovault/internal/config"
|
||||||
"github.com/echovault/echovault/pkg/commands"
|
"github.com/echovault/echovault/pkg/commands"
|
||||||
"github.com/echovault/echovault/pkg/echovault"
|
"github.com/echovault/echovault/pkg/echovault"
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
@@ -33,7 +32,7 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.WithValue(context.Background(), utils.ContextServerID("ServerID"), conf.ServerID)
|
ctx := context.WithValue(context.Background(), internal.ContextServerID("ServerID"), conf.ServerID)
|
||||||
|
|
||||||
// Default BindAddr if it's not specified
|
// Default BindAddr if it's not specified
|
||||||
if conf.BindAddr == "" {
|
if conf.BindAddr == "" {
|
||||||
|
@@ -1,77 +1,4 @@
|
|||||||
mode: set
|
mode: set
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:28.115,34.29 4 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:34.29,35.54 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:35.54,41.42 4 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:41.42,43.5 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:45.4,48.12 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.3,51.36 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.36,58.43 5 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:58.43,60.5 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:62.4,64.21 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:68.2,70.25 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:73.109,77.35 3 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:77.35,78.65 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:78.65,79.41 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:79.41,81.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:82.4,82.12 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:84.3,84.13 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:87.2,87.51 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:90.112,91.18 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:92.9,97.36 4 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:97.36,98.66 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:98.66,99.52 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:99.52,103.6 3 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:104.5,104.13 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:106.4,107.14 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:109.3,110.26 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:112.9,116.45 3 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:116.45,118.4 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.3,119.42 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.42,123.37 3 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:123.37,124.67 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:124.67,125.53 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:125.53,126.59 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:126.59,130.8 3 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:132.6,132.14 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.5,134.54 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.54,137.6 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.9,139.50 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.50,143.37 3 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:143.37,144.67 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:144.67,145.53 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:145.53,147.24 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:147.24,150.8 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:152.6,152.14 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.5,154.33 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.33,157.6 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:159.9,161.4 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:162.3,163.26 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:164.10,165.50 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:169.112,171.2 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:173.33,180.60 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:180.60,180.86 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:188.60,190.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:197.62,197.88 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:205.62,205.88 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:214.62,214.88 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:224.60,226.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:227.113,228.49 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:228.49,230.6 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:231.5,231.41 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:239.60,241.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:242.113,244.18 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:244.18,246.6 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:247.5,247.53 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:255.60,257.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:258.113,259.47 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:259.47,261.6 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/admin/commands.go:262.5,262.41 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/connection/commands.go:25.108,26.18 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/connection/commands.go:27.10,28.50 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/connection/commands.go:29.9,30.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/connection/commands.go:31.9,32.72 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/connection/commands.go:36.33,43.60 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/connection/commands.go:43.60,45.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/acl/commands.go:33.108,34.34 1 1
|
github.com/echovault/echovault/pkg/modules/acl/commands.go:33.108,34.34 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/acl/commands.go:34.34,36.3 1 1
|
github.com/echovault/echovault/pkg/modules/acl/commands.go:34.34,36.3 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/acl/commands.go:37.2,38.9 2 1
|
github.com/echovault/echovault/pkg/modules/acl/commands.go:37.2,38.9 2 1
|
||||||
@@ -276,260 +203,6 @@ github.com/echovault/echovault/pkg/modules/acl/commands.go:569.62,571.7 1 1
|
|||||||
github.com/echovault/echovault/pkg/modules/acl/commands.go:579.62,581.7 1 1
|
github.com/echovault/echovault/pkg/modules/acl/commands.go:579.62,581.7 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/acl/commands.go:592.62,594.7 1 0
|
github.com/echovault/echovault/pkg/modules/acl/commands.go:592.62,594.7 1 0
|
||||||
github.com/echovault/echovault/pkg/modules/acl/commands.go:602.62,604.7 1 0
|
github.com/echovault/echovault/pkg/modules/acl/commands.go:602.62,604.7 1 0
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:33.13,34.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:34.34,38.3 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:40.2,41.29 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:41.29,43.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:51.104,53.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:53.16,55.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:57.2,62.16 5 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:62.16,64.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.2,68.16 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.16,69.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:69.34,71.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:71.9,73.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.2,76.44 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.44,78.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:78.34,80.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:81.3,81.36 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.8,82.51 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.51,84.33 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:84.33,86.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:87.3,87.45 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:88.8,90.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:90.34,93.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:93.9,96.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.2,98.16 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.16,100.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:101.2,103.76 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:103.76,105.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.2,108.28 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.28,110.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:112.2,112.17 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:115.105,116.44 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:116.44,118.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:120.2,123.15 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:123.15,124.29 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:124.29,125.16 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:125.16,131.5 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.2,136.30 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.30,137.15 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:137.15,142.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.2,147.28 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.28,148.31 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:148.31,149.52 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:149.52,151.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:152.4,153.12 2 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.3,155.60 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.60,157.4 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:158.3,158.55 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.2,162.28 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.28,163.58 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:163.58,165.4 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:168.2,168.38 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:171.104,173.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:173.16,175.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:176.2,178.33 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:178.33,180.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:182.2,183.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:183.16,185.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:186.2,190.51 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:193.105,195.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:195.16,197.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:199.2,202.27 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:202.27,203.31 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:203.31,205.12 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.3,207.33 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.33,209.18 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:209.18,211.5 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:212.4,213.12 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:215.3,215.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.2,217.15 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.15,218.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:218.34,219.14 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:219.14,222.5 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.2,226.28 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.28,228.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:230.2,232.30 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:232.30,233.24 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:233.24,235.12 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:237.3,237.96 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:240.2,240.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:243.104,245.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:245.16,247.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:248.2,249.27 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:249.27,251.17 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:251.17,253.12 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:255.3,255.13 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:257.2,257.51 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:260.108,262.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:262.16,264.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:266.2,268.33 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:268.33,270.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.2,272.51 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.51,274.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:275.2,278.31 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:278.31,280.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:282.2,284.30 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:287.111,289.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:289.16,291.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:293.2,295.33 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:295.33,297.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.2,299.52 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.52,301.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:302.2,306.31 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:306.31,308.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:310.2,311.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:311.46,313.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:315.2,315.47 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:318.104,320.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:320.16,322.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:324.2,326.33 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:326.33,328.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.2,330.52 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.52,332.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:333.2,337.31 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:337.31,339.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:341.2,342.39 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:342.39,344.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.2,346.12 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.12,348.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:350.2,350.47 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:353.107,355.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:355.16,357.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:359.2,363.16 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:363.16,365.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:366.2,367.42 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:367.42,369.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.2,371.33 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.33,373.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.2,375.51 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.51,377.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:378.2,380.19 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:380.19,383.3 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:385.2,387.33 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:388.12,389.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:389.39,391.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:392.3,392.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:393.12,394.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:394.39,396.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:397.3,397.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:398.12,399.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:399.39,401.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.3,402.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.39,404.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:405.3,405.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:406.12,407.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:407.39,408.40 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:408.40,410.5 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:411.4,411.47 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:413.3,413.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:414.10,415.71 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:418.2,418.30 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:421.109,423.16 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:423.16,425.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:427.2,431.16 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:431.16,433.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:434.2,435.44 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:435.44,437.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.2,439.33 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.33,441.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.2,443.51 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.51,445.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:446.2,448.19 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:448.19,451.3 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:453.2,455.33 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:456.12,457.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:457.39,459.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:460.3,460.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:461.12,462.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:462.39,464.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:465.3,465.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:466.12,467.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:467.39,469.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.3,470.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.39,472.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:473.3,473.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:474.12,475.39 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:475.39,476.40 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:476.40,478.5 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:479.4,479.47 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:481.3,481.46 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:482.10,483.71 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:486.2,486.30 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/commands.go:489.33,644.2 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:22.49,23.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.34,25.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:26.2,26.30 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:29.50,30.25 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:30.25,32.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:33.2,34.30 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.30,35.15 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.15,37.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.2,39.18 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:42.49,43.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:43.19,45.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:46.2,46.30 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:49.50,50.18 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:50.18,52.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:53.2,53.21 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:56.49,57.18 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:57.18,59.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:60.2,60.21 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.53,64.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:64.19,66.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:67.2,67.21 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:70.56,71.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:71.19,73.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.2,74.21 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.49,78.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:78.19,80.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:81.2,81.21 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.52,85.34 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.34,87.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,88.30 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:91.54,92.34 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:92.34,94.3 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.2,95.30 1 0
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:31.77,32.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:32.19,34.3 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:35.2,35.33 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:36.13,38.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:40.12,41.26 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:41.26,43.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:44.3,45.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:47.12,48.26 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:48.26,50.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:51.3,52.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:54.12,55.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:55.19,57.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.3,58.29 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.29,60.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:61.3,63.17 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:63.17,65.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:66.3,67.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:69.12,70.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:70.19,72.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.3,73.29 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.29,75.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:76.3,78.17 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:78.17,80.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:81.3,82.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:84.14,85.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:85.19,87.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.3,88.29 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.29,90.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:91.3,93.17 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:93.17,95.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:96.3,97.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:99.14,100.19 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:100.19,102.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.3,103.29 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.29,105.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:106.3,108.17 3 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:108.17,110.4 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:111.3,112.46 2 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/generic/utils.go:114.10,115.95 1 1
|
|
||||||
github.com/echovault/echovault/pkg/modules/hash/commands.go:30.105,32.16 2 1
|
github.com/echovault/echovault/pkg/modules/hash/commands.go:30.105,32.16 2 1
|
||||||
github.com/echovault/echovault/pkg/modules/hash/commands.go:32.16,34.3 1 1
|
github.com/echovault/echovault/pkg/modules/hash/commands.go:32.16,34.3 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/hash/commands.go:36.2,39.25 3 1
|
github.com/echovault/echovault/pkg/modules/hash/commands.go:36.2,39.25 3 1
|
||||||
@@ -794,6 +467,260 @@ github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:99.2,99.22 1 1
|
|||||||
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1
|
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1
|
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1
|
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:33.13,34.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:34.34,38.3 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:40.2,41.29 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:41.29,43.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:51.104,53.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:53.16,55.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:57.2,62.16 5 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:62.16,64.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.2,68.16 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.16,69.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:69.34,71.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:71.9,73.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.2,76.44 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.44,78.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:78.34,80.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:81.3,81.36 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.8,82.51 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.51,84.33 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:84.33,86.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:87.3,87.45 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:88.8,90.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:90.34,93.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:93.9,96.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.2,98.16 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.16,100.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:101.2,103.76 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:103.76,105.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.2,108.28 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.28,110.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:112.2,112.17 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:115.105,116.44 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:116.44,118.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:120.2,123.15 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:123.15,124.29 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:124.29,125.16 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:125.16,131.5 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.2,136.30 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.30,137.15 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:137.15,142.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.2,147.28 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.28,148.31 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:148.31,149.52 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:149.52,151.5 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:152.4,153.12 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.3,155.60 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.60,157.4 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:158.3,158.55 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.2,162.28 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.28,163.58 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:163.58,165.4 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:168.2,168.38 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:171.104,173.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:173.16,175.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:176.2,178.33 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:178.33,180.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:182.2,183.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:183.16,185.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:186.2,190.51 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:193.105,195.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:195.16,197.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:199.2,202.27 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:202.27,203.31 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:203.31,205.12 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.3,207.33 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.33,209.18 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:209.18,211.5 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:212.4,213.12 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:215.3,215.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.2,217.15 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.15,218.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:218.34,219.14 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:219.14,222.5 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.2,226.28 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.28,228.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:230.2,232.30 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:232.30,233.24 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:233.24,235.12 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:237.3,237.96 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:240.2,240.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:243.104,245.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:245.16,247.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:248.2,249.27 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:249.27,251.17 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:251.17,253.12 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:255.3,255.13 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:257.2,257.51 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:260.108,262.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:262.16,264.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:266.2,268.33 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:268.33,270.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.2,272.51 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.51,274.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:275.2,278.31 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:278.31,280.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:282.2,284.30 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:287.111,289.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:289.16,291.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:293.2,295.33 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:295.33,297.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.2,299.52 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.52,301.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:302.2,306.31 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:306.31,308.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:310.2,311.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:311.46,313.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:315.2,315.47 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:318.104,320.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:320.16,322.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:324.2,326.33 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:326.33,328.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.2,330.52 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.52,332.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:333.2,337.31 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:337.31,339.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:341.2,342.39 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:342.39,344.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.2,346.12 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.12,348.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:350.2,350.47 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:353.107,355.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:355.16,357.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:359.2,363.16 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:363.16,365.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:366.2,367.42 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:367.42,369.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.2,371.33 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.33,373.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.2,375.51 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.51,377.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:378.2,380.19 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:380.19,383.3 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:385.2,387.33 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:388.12,389.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:389.39,391.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:392.3,392.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:393.12,394.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:394.39,396.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:397.3,397.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:398.12,399.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:399.39,401.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.3,402.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.39,404.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:405.3,405.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:406.12,407.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:407.39,408.40 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:408.40,410.5 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:411.4,411.47 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:413.3,413.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:414.10,415.71 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:418.2,418.30 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:421.109,423.16 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:423.16,425.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:427.2,431.16 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:431.16,433.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:434.2,435.44 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:435.44,437.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.2,439.33 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.33,441.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.2,443.51 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.51,445.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:446.2,448.19 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:448.19,451.3 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:453.2,455.33 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:456.12,457.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:457.39,459.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:460.3,460.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:461.12,462.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:462.39,464.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:465.3,465.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:466.12,467.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:467.39,469.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.3,470.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.39,472.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:473.3,473.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:474.12,475.39 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:475.39,476.40 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:476.40,478.5 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:479.4,479.47 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:481.3,481.46 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:482.10,483.71 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:486.2,486.30 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/commands.go:489.33,644.2 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:22.49,23.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.34,25.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:26.2,26.30 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:29.50,30.25 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:30.25,32.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:33.2,34.30 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.30,35.15 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.15,37.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.2,39.18 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:42.49,43.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:43.19,45.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:46.2,46.30 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:49.50,50.18 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:50.18,52.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:53.2,53.21 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:56.49,57.18 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:57.18,59.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:60.2,60.21 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.53,64.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:64.19,66.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:67.2,67.21 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:70.56,71.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:71.19,73.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.2,74.21 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.49,78.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:78.19,80.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:81.2,81.21 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.52,85.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.34,87.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,88.30 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:91.54,92.34 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:92.34,94.3 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.2,95.30 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:31.77,32.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:32.19,34.3 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:35.2,35.33 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:36.13,38.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:40.12,41.26 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:41.26,43.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:44.3,45.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:47.12,48.26 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:48.26,50.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:51.3,52.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:54.12,55.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:55.19,57.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.3,58.29 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.29,60.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:61.3,63.17 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:63.17,65.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:66.3,67.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:69.12,70.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:70.19,72.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.3,73.29 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.29,75.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:76.3,78.17 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:78.17,80.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:81.3,82.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:84.14,85.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:85.19,87.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.3,88.29 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.29,90.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:91.3,93.17 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:93.17,95.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:96.3,97.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:99.14,100.19 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:100.19,102.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.3,103.29 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.29,105.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:106.3,108.17 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:108.17,110.4 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:111.3,112.46 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/generic/utils.go:114.10,115.95 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/list/commands.go:29.105,31.16 2 1
|
github.com/echovault/echovault/pkg/modules/list/commands.go:29.105,31.16 2 1
|
||||||
github.com/echovault/echovault/pkg/modules/list/commands.go:31.16,33.3 1 1
|
github.com/echovault/echovault/pkg/modules/list/commands.go:31.16,33.3 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/list/commands.go:35.2,37.33 2 1
|
github.com/echovault/echovault/pkg/modules/list/commands.go:35.2,37.33 2 1
|
||||||
@@ -1013,6 +940,79 @@ github.com/echovault/echovault/pkg/modules/list/key_funcs.go:82.2,82.30 1 1
|
|||||||
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1
|
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1
|
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1
|
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:28.115,34.29 4 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:34.29,35.54 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:35.54,41.42 4 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:41.42,43.5 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:45.4,48.12 3 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.3,51.36 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.36,58.43 5 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:58.43,60.5 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:62.4,64.21 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:68.2,70.25 2 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:73.109,77.35 3 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:77.35,78.65 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:78.65,79.41 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:79.41,81.5 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:82.4,82.12 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:84.3,84.13 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:87.2,87.51 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:90.112,91.18 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:92.9,97.36 4 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:97.36,98.66 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:98.66,99.52 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:99.52,103.6 3 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:104.5,104.13 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:106.4,107.14 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:109.3,110.26 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:112.9,116.45 3 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:116.45,118.4 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.3,119.42 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.42,123.37 3 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:123.37,124.67 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:124.67,125.53 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:125.53,126.59 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:126.59,130.8 3 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:132.6,132.14 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.5,134.54 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.54,137.6 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.9,139.50 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.50,143.37 3 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:143.37,144.67 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:144.67,145.53 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:145.53,147.24 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:147.24,150.8 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:152.6,152.14 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.5,154.33 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.33,157.6 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:159.9,161.4 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:162.3,163.26 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:164.10,165.50 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:169.112,171.2 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:173.33,180.60 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:180.60,180.86 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:188.60,190.5 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:197.62,197.88 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:205.62,205.88 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:214.62,214.88 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:224.60,226.5 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:227.113,228.49 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:228.49,230.6 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:231.5,231.41 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:239.60,241.5 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:242.113,244.18 2 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:244.18,246.6 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:247.5,247.53 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:255.60,257.5 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:258.113,259.47 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:259.47,261.6 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/admin/commands.go:262.5,262.41 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/connection/commands.go:25.108,26.18 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/connection/commands.go:27.10,28.50 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/connection/commands.go:29.9,30.34 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/connection/commands.go:31.9,32.72 1 1
|
||||||
|
github.com/echovault/echovault/pkg/modules/connection/commands.go:36.33,43.60 1 0
|
||||||
|
github.com/echovault/echovault/pkg/modules/connection/commands.go:43.60,45.5 1 0
|
||||||
github.com/echovault/echovault/pkg/modules/set/commands.go:28.108,30.16 2 1
|
github.com/echovault/echovault/pkg/modules/set/commands.go:28.108,30.16 2 1
|
||||||
github.com/echovault/echovault/pkg/modules/set/commands.go:30.16,32.3 1 1
|
github.com/echovault/echovault/pkg/modules/set/commands.go:30.16,32.3 1 1
|
||||||
github.com/echovault/echovault/pkg/modules/set/commands.go:34.2,38.33 3 1
|
github.com/echovault/echovault/pkg/modules/set/commands.go:34.2,38.33 3 1
|
||||||
|
@@ -16,9 +16,9 @@ package aof
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/echovault/echovault/internal"
|
||||||
logstore "github.com/echovault/echovault/internal/aof/log"
|
logstore "github.com/echovault/echovault/internal/aof/log"
|
||||||
"github.com/echovault/echovault/internal/aof/preamble"
|
"github.com/echovault/echovault/internal/aof/preamble"
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
|
||||||
"log"
|
"log"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
@@ -40,8 +40,8 @@ type Engine struct {
|
|||||||
|
|
||||||
startRewriteFunc func()
|
startRewriteFunc func()
|
||||||
finishRewriteFunc func()
|
finishRewriteFunc func()
|
||||||
getStateFunc func() map[string]utils.KeyData
|
getStateFunc func() map[string]internal.KeyData
|
||||||
setKeyDataFunc func(key string, data utils.KeyData)
|
setKeyDataFunc func(key string, data internal.KeyData)
|
||||||
handleCommand func(command []byte)
|
handleCommand func(command []byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,13 +69,13 @@ func WithFinishRewriteFunc(f func()) func(engine *Engine) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithGetStateFunc(f func() map[string]utils.KeyData) func(engine *Engine) {
|
func WithGetStateFunc(f func() map[string]internal.KeyData) func(engine *Engine) {
|
||||||
return func(engine *Engine) {
|
return func(engine *Engine) {
|
||||||
engine.getStateFunc = f
|
engine.getStateFunc = f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithSetKeyDataFunc(f func(key string, data utils.KeyData)) func(engine *Engine) {
|
func WithSetKeyDataFunc(f func(key string, data internal.KeyData)) func(engine *Engine) {
|
||||||
return func(engine *Engine) {
|
return func(engine *Engine) {
|
||||||
engine.setKeyDataFunc = f
|
engine.setKeyDataFunc = f
|
||||||
}
|
}
|
||||||
@@ -108,8 +108,8 @@ func NewAOFEngine(options ...func(engine *Engine)) *Engine {
|
|||||||
logCount: 0,
|
logCount: 0,
|
||||||
startRewriteFunc: func() {},
|
startRewriteFunc: func() {},
|
||||||
finishRewriteFunc: func() {},
|
finishRewriteFunc: func() {},
|
||||||
getStateFunc: func() map[string]utils.KeyData { return nil },
|
getStateFunc: func() map[string]internal.KeyData { return nil },
|
||||||
setKeyDataFunc: func(key string, data utils.KeyData) {},
|
setKeyDataFunc: func(key string, data internal.KeyData) {},
|
||||||
handleCommand: func(command []byte) {},
|
handleCommand: func(command []byte) {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -17,7 +17,7 @@ package preamble
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
"github.com/echovault/echovault/internal"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
@@ -37,8 +37,8 @@ type PreambleStore struct {
|
|||||||
rw PreambleReadWriter
|
rw PreambleReadWriter
|
||||||
mut sync.Mutex
|
mut sync.Mutex
|
||||||
directory string
|
directory string
|
||||||
getStateFunc func() map[string]utils.KeyData
|
getStateFunc func() map[string]internal.KeyData
|
||||||
setKeyDataFunc func(key string, data utils.KeyData)
|
setKeyDataFunc func(key string, data internal.KeyData)
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithReadWriter(rw PreambleReadWriter) func(store *PreambleStore) {
|
func WithReadWriter(rw PreambleReadWriter) func(store *PreambleStore) {
|
||||||
@@ -47,13 +47,13 @@ func WithReadWriter(rw PreambleReadWriter) func(store *PreambleStore) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithGetStateFunc(f func() map[string]utils.KeyData) func(store *PreambleStore) {
|
func WithGetStateFunc(f func() map[string]internal.KeyData) func(store *PreambleStore) {
|
||||||
return func(store *PreambleStore) {
|
return func(store *PreambleStore) {
|
||||||
store.getStateFunc = f
|
store.getStateFunc = f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithSetKeyDataFunc(f func(key string, data utils.KeyData)) func(store *PreambleStore) {
|
func WithSetKeyDataFunc(f func(key string, data internal.KeyData)) func(store *PreambleStore) {
|
||||||
return func(store *PreambleStore) {
|
return func(store *PreambleStore) {
|
||||||
store.setKeyDataFunc = f
|
store.setKeyDataFunc = f
|
||||||
}
|
}
|
||||||
@@ -70,11 +70,11 @@ func NewPreambleStore(options ...func(store *PreambleStore)) *PreambleStore {
|
|||||||
rw: nil,
|
rw: nil,
|
||||||
mut: sync.Mutex{},
|
mut: sync.Mutex{},
|
||||||
directory: "",
|
directory: "",
|
||||||
getStateFunc: func() map[string]utils.KeyData {
|
getStateFunc: func() map[string]internal.KeyData {
|
||||||
// No-Op by default
|
// No-Op by default
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
setKeyDataFunc: func(key string, data utils.KeyData) {},
|
setKeyDataFunc: func(key string, data internal.KeyData) {},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
@@ -143,7 +143,7 @@ func (store *PreambleStore) Restore() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
state := make(map[string]utils.KeyData)
|
state := make(map[string]internal.KeyData)
|
||||||
|
|
||||||
if err = json.Unmarshal(b, &state); err != nil {
|
if err = json.Unmarshal(b, &state); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -163,7 +163,7 @@ func (store *PreambleStore) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// filterExpiredKeys filters out keys that are already expired, so they are not persisted.
|
// filterExpiredKeys filters out keys that are already expired, so they are not persisted.
|
||||||
func (store *PreambleStore) filterExpiredKeys(state map[string]utils.KeyData) map[string]utils.KeyData {
|
func (store *PreambleStore) filterExpiredKeys(state map[string]internal.KeyData) map[string]internal.KeyData {
|
||||||
var keysToDelete []string
|
var keysToDelete []string
|
||||||
for k, v := range state {
|
for k, v := range state {
|
||||||
if v.ExpireAt.Before(time.Now()) {
|
if v.ExpireAt.Before(time.Now()) {
|
||||||
|
@@ -20,7 +20,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/echovault/echovault/internal"
|
"github.com/echovault/echovault/internal"
|
||||||
"github.com/echovault/echovault/internal/config"
|
"github.com/echovault/echovault/internal/config"
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
|
||||||
"github.com/hashicorp/memberlist"
|
"github.com/hashicorp/memberlist"
|
||||||
"github.com/hashicorp/raft"
|
"github.com/hashicorp/raft"
|
||||||
"log"
|
"log"
|
||||||
@@ -93,8 +92,8 @@ func (delegate *Delegate) NotifyMsg(msgBytes []byte) {
|
|||||||
}
|
}
|
||||||
// Current node is the cluster leader, handle the key deletion
|
// Current node is the cluster leader, handle the key deletion
|
||||||
ctx := context.WithValue(
|
ctx := context.WithValue(
|
||||||
context.WithValue(context.Background(), utils.ContextServerID("ServerID"), string(msg.ServerID)),
|
context.WithValue(context.Background(), internal.ContextServerID("ServerID"), string(msg.ServerID)),
|
||||||
utils.ContextConnID("ConnectionID"), msg.ConnId)
|
internal.ContextConnID("ConnectionID"), msg.ConnId)
|
||||||
|
|
||||||
key := string(msg.Content)
|
key := string(msg.Content)
|
||||||
|
|
||||||
@@ -110,8 +109,8 @@ func (delegate *Delegate) NotifyMsg(msgBytes []byte) {
|
|||||||
}
|
}
|
||||||
// Current node is the cluster leader, handle the mutation
|
// Current node is the cluster leader, handle the mutation
|
||||||
ctx := context.WithValue(
|
ctx := context.WithValue(
|
||||||
context.WithValue(context.Background(), utils.ContextServerID("ServerID"), string(msg.ServerID)),
|
context.WithValue(context.Background(), internal.ContextServerID("ServerID"), string(msg.ServerID)),
|
||||||
utils.ContextConnID("ConnectionID"), msg.ConnId)
|
internal.ContextConnID("ConnectionID"), msg.ConnId)
|
||||||
|
|
||||||
cmd, err := internal.Decode(msg.Content)
|
cmd, err := internal.Decode(msg.Content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -23,7 +23,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
|
||||||
"github.com/hashicorp/memberlist"
|
"github.com/hashicorp/memberlist"
|
||||||
"github.com/hashicorp/raft"
|
"github.com/hashicorp/raft"
|
||||||
"github.com/sethvargo/go-retry"
|
"github.com/sethvargo/go-retry"
|
||||||
@@ -124,7 +123,7 @@ func (m *MemberList) broadcastRaftAddress() {
|
|||||||
// The ForwardDeleteKey function is only called by non-leaders.
|
// The ForwardDeleteKey function is only called by non-leaders.
|
||||||
// It uses the broadcast queue to forward a key eviction command within the cluster.
|
// It uses the broadcast queue to forward a key eviction command within the cluster.
|
||||||
func (m *MemberList) ForwardDeleteKey(ctx context.Context, key string) {
|
func (m *MemberList) ForwardDeleteKey(ctx context.Context, key string) {
|
||||||
connId, _ := ctx.Value(utils.ContextConnID("ConnectionID")).(string)
|
connId, _ := ctx.Value(internal.ContextConnID("ConnectionID")).(string)
|
||||||
m.broadcastQueue.QueueBroadcast(&BroadcastMessage{
|
m.broadcastQueue.QueueBroadcast(&BroadcastMessage{
|
||||||
Action: "DeleteKey",
|
Action: "DeleteKey",
|
||||||
Content: []byte(key),
|
Content: []byte(key),
|
||||||
@@ -141,7 +140,7 @@ func (m *MemberList) ForwardDeleteKey(ctx context.Context, key string) {
|
|||||||
// The ForwardDataMutation function is only called by non-leaders.
|
// The ForwardDataMutation function is only called by non-leaders.
|
||||||
// It uses the broadcast queue to forward a data mutation within the cluster.
|
// It uses the broadcast queue to forward a data mutation within the cluster.
|
||||||
func (m *MemberList) ForwardDataMutation(ctx context.Context, cmd []byte) {
|
func (m *MemberList) ForwardDataMutation(ctx context.Context, cmd []byte) {
|
||||||
connId, _ := ctx.Value(utils.ContextConnID("ConnectionID")).(string)
|
connId, _ := ctx.Value(internal.ContextConnID("ConnectionID")).(string)
|
||||||
m.broadcastQueue.QueueBroadcast(&BroadcastMessage{
|
m.broadcastQueue.QueueBroadcast(&BroadcastMessage{
|
||||||
Action: "MutateData",
|
Action: "MutateData",
|
||||||
Content: cmd,
|
Content: cmd,
|
||||||
|
@@ -18,7 +18,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/echovault/echovault/internal"
|
"github.com/echovault/echovault/internal"
|
||||||
"github.com/echovault/echovault/internal/config"
|
"github.com/echovault/echovault/internal/config"
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
|
||||||
"github.com/hashicorp/raft"
|
"github.com/hashicorp/raft"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -26,7 +25,7 @@ import (
|
|||||||
|
|
||||||
type SnapshotOpts struct {
|
type SnapshotOpts struct {
|
||||||
config config.Config
|
config config.Config
|
||||||
data map[string]utils.KeyData
|
data map[string]internal.KeyData
|
||||||
startSnapshot func()
|
startSnapshot func()
|
||||||
finishSnapshot func()
|
finishSnapshot func()
|
||||||
setLatestSnapshot func(msec int64)
|
setLatestSnapshot func(msec int64)
|
||||||
@@ -52,7 +51,7 @@ func (s *Snapshot) Persist(sink raft.SnapshotSink) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
snapshotObject := utils.SnapshotObject{
|
snapshotObject := internal.SnapshotObject{
|
||||||
State: internal.FilterExpiredKeys(s.options.data),
|
State: internal.FilterExpiredKeys(s.options.data),
|
||||||
LatestSnapshotMilliseconds: int64(msec),
|
LatestSnapshotMilliseconds: int64(msec),
|
||||||
}
|
}
|
||||||
|
@@ -30,6 +30,7 @@ import (
|
|||||||
type FSMOpts struct {
|
type FSMOpts struct {
|
||||||
Config config.Config
|
Config config.Config
|
||||||
EchoVault utils.EchoVault
|
EchoVault utils.EchoVault
|
||||||
|
GetState func() map[string]internal.KeyData
|
||||||
GetCommand func(command string) (utils.Command, error)
|
GetCommand func(command string) (utils.Command, error)
|
||||||
DeleteKey func(ctx context.Context, key string) error
|
DeleteKey func(ctx context.Context, key string) error
|
||||||
}
|
}
|
||||||
@@ -50,33 +51,33 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
|
|||||||
default:
|
default:
|
||||||
// No-Op
|
// No-Op
|
||||||
case raft.LogCommand:
|
case raft.LogCommand:
|
||||||
var request utils.ApplyRequest
|
var request internal.ApplyRequest
|
||||||
|
|
||||||
if err := json.Unmarshal(log.Data, &request); err != nil {
|
if err := json.Unmarshal(log.Data, &request); err != nil {
|
||||||
return utils.ApplyResponse{
|
return internal.ApplyResponse{
|
||||||
Error: err,
|
Error: err,
|
||||||
Response: nil,
|
Response: nil,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.WithValue(context.Background(), utils.ContextServerID("ServerID"), request.ServerID)
|
ctx := context.WithValue(context.Background(), internal.ContextServerID("ServerID"), request.ServerID)
|
||||||
ctx = context.WithValue(ctx, utils.ContextConnID("ConnectionID"), request.ConnectionID)
|
ctx = context.WithValue(ctx, internal.ContextConnID("ConnectionID"), request.ConnectionID)
|
||||||
|
|
||||||
switch strings.ToLower(request.Type) {
|
switch strings.ToLower(request.Type) {
|
||||||
default:
|
default:
|
||||||
return utils.ApplyResponse{
|
return internal.ApplyResponse{
|
||||||
Error: fmt.Errorf("unsupported raft command type %s", request.Type),
|
Error: fmt.Errorf("unsupported raft command type %s", request.Type),
|
||||||
Response: nil,
|
Response: nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
case "delete-key":
|
case "delete-key":
|
||||||
if err := fsm.options.DeleteKey(ctx, request.Key); err != nil {
|
if err := fsm.options.DeleteKey(ctx, request.Key); err != nil {
|
||||||
return utils.ApplyResponse{
|
return internal.ApplyResponse{
|
||||||
Error: err,
|
Error: err,
|
||||||
Response: nil,
|
Response: nil,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return utils.ApplyResponse{
|
return internal.ApplyResponse{
|
||||||
Error: nil,
|
Error: nil,
|
||||||
Response: []byte("OK"),
|
Response: []byte("OK"),
|
||||||
}
|
}
|
||||||
@@ -85,7 +86,7 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
|
|||||||
// Handle command
|
// Handle command
|
||||||
command, err := fsm.options.GetCommand(request.CMD[0])
|
command, err := fsm.options.GetCommand(request.CMD[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.ApplyResponse{
|
return internal.ApplyResponse{
|
||||||
Error: err,
|
Error: err,
|
||||||
Response: nil,
|
Response: nil,
|
||||||
}
|
}
|
||||||
@@ -99,12 +100,12 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if res, err := handler(ctx, request.CMD, fsm.options.EchoVault, nil); err != nil {
|
if res, err := handler(ctx, request.CMD, fsm.options.EchoVault, nil); err != nil {
|
||||||
return utils.ApplyResponse{
|
return internal.ApplyResponse{
|
||||||
Error: err,
|
Error: err,
|
||||||
Response: nil,
|
Response: nil,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return utils.ApplyResponse{
|
return internal.ApplyResponse{
|
||||||
Error: nil,
|
Error: nil,
|
||||||
Response: res,
|
Response: res,
|
||||||
}
|
}
|
||||||
@@ -119,10 +120,10 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
|
|||||||
func (fsm *FSM) Snapshot() (raft.FSMSnapshot, error) {
|
func (fsm *FSM) Snapshot() (raft.FSMSnapshot, error) {
|
||||||
return NewFSMSnapshot(SnapshotOpts{
|
return NewFSMSnapshot(SnapshotOpts{
|
||||||
config: fsm.options.Config,
|
config: fsm.options.Config,
|
||||||
data: fsm.options.EchoVault.GetState(),
|
|
||||||
startSnapshot: fsm.options.EchoVault.StartSnapshot,
|
startSnapshot: fsm.options.EchoVault.StartSnapshot,
|
||||||
finishSnapshot: fsm.options.EchoVault.FinishSnapshot,
|
finishSnapshot: fsm.options.EchoVault.FinishSnapshot,
|
||||||
setLatestSnapshot: fsm.options.EchoVault.SetLatestSnapshot,
|
setLatestSnapshot: fsm.options.EchoVault.SetLatestSnapshot,
|
||||||
|
data: fsm.options.GetState(),
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,8 +136,8 @@ func (fsm *FSM) Restore(snapshot io.ReadCloser) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := utils.SnapshotObject{
|
data := internal.SnapshotObject{
|
||||||
State: make(map[string]utils.KeyData),
|
State: make(map[string]internal.KeyData),
|
||||||
LatestSnapshotMilliseconds: 0,
|
LatestSnapshotMilliseconds: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,6 +18,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/echovault/echovault/internal"
|
||||||
"github.com/echovault/echovault/internal/config"
|
"github.com/echovault/echovault/internal/config"
|
||||||
"github.com/echovault/echovault/internal/memberlist"
|
"github.com/echovault/echovault/internal/memberlist"
|
||||||
"log"
|
"log"
|
||||||
@@ -34,6 +35,7 @@ import (
|
|||||||
type Opts struct {
|
type Opts struct {
|
||||||
Config config.Config
|
Config config.Config
|
||||||
EchoVault utils.EchoVault
|
EchoVault utils.EchoVault
|
||||||
|
GetState func() map[string]internal.KeyData
|
||||||
GetCommand func(command string) (utils.Command, error)
|
GetCommand func(command string) (utils.Command, error)
|
||||||
DeleteKey func(ctx context.Context, key string) error
|
DeleteKey func(ctx context.Context, key string) error
|
||||||
}
|
}
|
||||||
@@ -109,6 +111,7 @@ func (r *Raft) RaftInit(ctx context.Context) {
|
|||||||
NewFSM(FSMOpts{
|
NewFSM(FSMOpts{
|
||||||
Config: r.options.Config,
|
Config: r.options.Config,
|
||||||
EchoVault: r.options.EchoVault,
|
EchoVault: r.options.EchoVault,
|
||||||
|
GetState: r.options.GetState,
|
||||||
GetCommand: r.options.GetCommand,
|
GetCommand: r.options.GetCommand,
|
||||||
DeleteKey: r.options.DeleteKey,
|
DeleteKey: r.options.DeleteKey,
|
||||||
}),
|
}),
|
||||||
|
@@ -20,7 +20,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/echovault/echovault/internal"
|
"github.com/echovault/echovault/internal"
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
@@ -44,10 +43,10 @@ type Engine struct {
|
|||||||
snapshotThreshold uint64
|
snapshotThreshold uint64
|
||||||
startSnapshotFunc func()
|
startSnapshotFunc func()
|
||||||
finishSnapshotFunc func()
|
finishSnapshotFunc func()
|
||||||
getStateFunc func() map[string]utils.KeyData
|
getStateFunc func() map[string]internal.KeyData
|
||||||
setLatestSnapshotTimeFunc func(msec int64)
|
setLatestSnapshotTimeFunc func(msec int64)
|
||||||
getLatestSnapshotTimeFunc func() int64
|
getLatestSnapshotTimeFunc func() int64
|
||||||
setKeyDataFunc func(key string, data utils.KeyData)
|
setKeyDataFunc func(key string, data internal.KeyData)
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithDirectory(directory string) func(engine *Engine) {
|
func WithDirectory(directory string) func(engine *Engine) {
|
||||||
@@ -80,7 +79,7 @@ func WithFinishSnapshotFunc(f func()) func(engine *Engine) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithGetStateFunc(f func() map[string]utils.KeyData) func(engine *Engine) {
|
func WithGetStateFunc(f func() map[string]internal.KeyData) func(engine *Engine) {
|
||||||
return func(engine *Engine) {
|
return func(engine *Engine) {
|
||||||
engine.getStateFunc = f
|
engine.getStateFunc = f
|
||||||
}
|
}
|
||||||
@@ -98,7 +97,7 @@ func WithGetLatestSnapshotTimeFunc(f func() int64) func(engine *Engine) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithSetKeyDataFunc(f func(key string, data utils.KeyData)) func(engine *Engine) {
|
func WithSetKeyDataFunc(f func(key string, data internal.KeyData)) func(engine *Engine) {
|
||||||
return func(engine *Engine) {
|
return func(engine *Engine) {
|
||||||
engine.setKeyDataFunc = f
|
engine.setKeyDataFunc = f
|
||||||
}
|
}
|
||||||
@@ -112,14 +111,14 @@ func NewSnapshotEngine(options ...func(engine *Engine)) *Engine {
|
|||||||
snapshotThreshold: 1000,
|
snapshotThreshold: 1000,
|
||||||
startSnapshotFunc: func() {},
|
startSnapshotFunc: func() {},
|
||||||
finishSnapshotFunc: func() {},
|
finishSnapshotFunc: func() {},
|
||||||
getStateFunc: func() map[string]utils.KeyData {
|
getStateFunc: func() map[string]internal.KeyData {
|
||||||
return map[string]utils.KeyData{}
|
return map[string]internal.KeyData{}
|
||||||
},
|
},
|
||||||
setLatestSnapshotTimeFunc: func(msec int64) {},
|
setLatestSnapshotTimeFunc: func(msec int64) {},
|
||||||
getLatestSnapshotTimeFunc: func() int64 {
|
getLatestSnapshotTimeFunc: func() int64 {
|
||||||
return 0
|
return 0
|
||||||
},
|
},
|
||||||
setKeyDataFunc: func(key string, data utils.KeyData) {},
|
setKeyDataFunc: func(key string, data internal.KeyData) {},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
@@ -205,7 +204,7 @@ func (engine *Engine) TakeSnapshot() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get current state
|
// Get current state
|
||||||
snapshotObject := utils.SnapshotObject{
|
snapshotObject := internal.SnapshotObject{
|
||||||
State: internal.FilterExpiredKeys(engine.getStateFunc()),
|
State: internal.FilterExpiredKeys(engine.getStateFunc()),
|
||||||
LatestSnapshotMilliseconds: engine.getLatestSnapshotTimeFunc(),
|
LatestSnapshotMilliseconds: engine.getLatestSnapshotTimeFunc(),
|
||||||
}
|
}
|
||||||
@@ -334,7 +333,7 @@ func (engine *Engine) Restore() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
snapshotObject := new(utils.SnapshotObject)
|
snapshotObject := new(internal.SnapshotObject)
|
||||||
|
|
||||||
if err = json.Unmarshal(sd, snapshotObject); err != nil {
|
if err = json.Unmarshal(sd, snapshotObject); err != nil {
|
||||||
return err
|
return err
|
||||||
|
43
internal/types.go
Normal file
43
internal/types.go
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
// 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 internal
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type KeyData struct {
|
||||||
|
Value interface{}
|
||||||
|
ExpireAt time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
type ContextServerID string
|
||||||
|
type ContextConnID string
|
||||||
|
|
||||||
|
type ApplyRequest struct {
|
||||||
|
Type string `json:"Type"` // command | delete-key
|
||||||
|
ServerID string `json:"ServerID"`
|
||||||
|
ConnectionID string `json:"ConnectionID"`
|
||||||
|
CMD []string `json:"CMD"`
|
||||||
|
Key string `json:"Key"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ApplyResponse struct {
|
||||||
|
Error error
|
||||||
|
Response []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type SnapshotObject struct {
|
||||||
|
State map[string]KeyData
|
||||||
|
LatestSnapshotMilliseconds int64
|
||||||
|
}
|
@@ -202,7 +202,7 @@ func IsMaxMemoryExceeded(maxMemory uint64) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FilterExpiredKeys filters out keys that are already expired, so they are not persisted.
|
// FilterExpiredKeys filters out keys that are already expired, so they are not persisted.
|
||||||
func FilterExpiredKeys(state map[string]utils.KeyData) map[string]utils.KeyData {
|
func FilterExpiredKeys(state map[string]KeyData) map[string]KeyData {
|
||||||
var keysToDelete []string
|
var keysToDelete []string
|
||||||
for k, v := range state {
|
for k, v := range state {
|
||||||
// Skip keys with no expiry time.
|
// Skip keys with no expiry time.
|
||||||
|
@@ -18,7 +18,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/echovault/echovault/pkg/utils"
|
"github.com/echovault/echovault/internal"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -27,9 +27,9 @@ func (server *EchoVault) isInCluster() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) error {
|
func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) error {
|
||||||
serverId, _ := ctx.Value(utils.ContextServerID("ServerID")).(string)
|
serverId, _ := ctx.Value(internal.ContextServerID("ServerID")).(string)
|
||||||
|
|
||||||
deleteKeyRequest := utils.ApplyRequest{
|
deleteKeyRequest := internal.ApplyRequest{
|
||||||
Type: "delete-key",
|
Type: "delete-key",
|
||||||
ServerID: serverId,
|
ServerID: serverId,
|
||||||
ConnectionID: "nil",
|
ConnectionID: "nil",
|
||||||
@@ -47,7 +47,7 @@ func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) err
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
r, ok := applyFuture.Response().(utils.ApplyResponse)
|
r, ok := applyFuture.Response().(internal.ApplyResponse)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("unprocessable entity %v", r)
|
return fmt.Errorf("unprocessable entity %v", r)
|
||||||
@@ -61,10 +61,10 @@ func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (server *EchoVault) raftApplyCommand(ctx context.Context, cmd []string) ([]byte, error) {
|
func (server *EchoVault) raftApplyCommand(ctx context.Context, cmd []string) ([]byte, error) {
|
||||||
serverId, _ := ctx.Value(utils.ContextServerID("ServerID")).(string)
|
serverId, _ := ctx.Value(internal.ContextServerID("ServerID")).(string)
|
||||||
connectionId, _ := ctx.Value(utils.ContextConnID("ConnectionID")).(string)
|
connectionId, _ := ctx.Value(internal.ContextConnID("ConnectionID")).(string)
|
||||||
|
|
||||||
applyRequest := utils.ApplyRequest{
|
applyRequest := internal.ApplyRequest{
|
||||||
Type: "command",
|
Type: "command",
|
||||||
ServerID: serverId,
|
ServerID: serverId,
|
||||||
ConnectionID: connectionId,
|
ConnectionID: connectionId,
|
||||||
@@ -82,7 +82,7 @@ func (server *EchoVault) raftApplyCommand(ctx context.Context, cmd []string) ([]
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r, ok := applyFuture.Response().(utils.ApplyResponse)
|
r, ok := applyFuture.Response().(internal.ApplyResponse)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("unprocessable entity %v", r)
|
return nil, fmt.Errorf("unprocessable entity %v", r)
|
||||||
|
@@ -48,9 +48,9 @@ type EchoVault struct {
|
|||||||
// the new number is the new connection's ID.
|
// the new number is the new connection's ID.
|
||||||
connId atomic.Uint64
|
connId atomic.Uint64
|
||||||
|
|
||||||
store map[string]utils.KeyData // Data store to hold the keys and their associated data, expiry time, etc.
|
store map[string]internal.KeyData // Data store to hold the keys and their associated data, expiry time, etc.
|
||||||
keyLocks map[string]*sync.RWMutex // Map to hold all the individual key locks.
|
keyLocks map[string]*sync.RWMutex // Map to hold all the individual key locks.
|
||||||
keyCreationLock *sync.Mutex // The mutex for creating a new key. Only one goroutine should be able to create a key at a time.
|
keyCreationLock *sync.Mutex // The mutex for creating a new key. Only one goroutine should be able to create a key at a time.
|
||||||
|
|
||||||
// Holds all the keys that are currently associated with an expiry.
|
// Holds all the keys that are currently associated with an expiry.
|
||||||
keysWithExpiry struct {
|
keysWithExpiry struct {
|
||||||
@@ -111,7 +111,7 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
|
|||||||
context: context.Background(),
|
context: context.Background(),
|
||||||
commands: make([]utils.Command, 0),
|
commands: make([]utils.Command, 0),
|
||||||
config: config.DefaultConfig(),
|
config: config.DefaultConfig(),
|
||||||
store: make(map[string]utils.KeyData),
|
store: make(map[string]internal.KeyData),
|
||||||
keyLocks: make(map[string]*sync.RWMutex),
|
keyLocks: make(map[string]*sync.RWMutex),
|
||||||
keyCreationLock: &sync.Mutex{},
|
keyCreationLock: &sync.Mutex{},
|
||||||
}
|
}
|
||||||
@@ -120,7 +120,7 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
|
|||||||
option(echovault)
|
option(echovault)
|
||||||
}
|
}
|
||||||
|
|
||||||
echovault.context = context.WithValue(echovault.context, "ServerID", utils.ContextServerID(echovault.config.ServerID))
|
echovault.context = context.WithValue(echovault.context, "ServerID", internal.ContextServerID(echovault.config.ServerID))
|
||||||
|
|
||||||
// Set up ACL module
|
// Set up ACL module
|
||||||
echovault.ACL = acl.NewACL(echovault.config)
|
echovault.ACL = acl.NewACL(echovault.config)
|
||||||
@@ -134,6 +134,15 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
|
|||||||
EchoVault: echovault,
|
EchoVault: echovault,
|
||||||
GetCommand: echovault.getCommand,
|
GetCommand: echovault.getCommand,
|
||||||
DeleteKey: echovault.DeleteKey,
|
DeleteKey: echovault.DeleteKey,
|
||||||
|
GetState: func() map[string]internal.KeyData {
|
||||||
|
state := make(map[string]internal.KeyData)
|
||||||
|
for k, v := range echovault.getState() {
|
||||||
|
if data, ok := v.(internal.KeyData); ok {
|
||||||
|
state[k] = data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state
|
||||||
|
},
|
||||||
})
|
})
|
||||||
echovault.memberList = memberlist.NewMemberList(memberlist.Opts{
|
echovault.memberList = memberlist.NewMemberList(memberlist.Opts{
|
||||||
Config: echovault.config,
|
Config: echovault.config,
|
||||||
@@ -150,12 +159,20 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
|
|||||||
snapshot.WithDirectory(echovault.config.DataDir),
|
snapshot.WithDirectory(echovault.config.DataDir),
|
||||||
snapshot.WithThreshold(echovault.config.SnapShotThreshold),
|
snapshot.WithThreshold(echovault.config.SnapShotThreshold),
|
||||||
snapshot.WithInterval(echovault.config.SnapshotInterval),
|
snapshot.WithInterval(echovault.config.SnapshotInterval),
|
||||||
snapshot.WithGetStateFunc(echovault.GetState),
|
|
||||||
snapshot.WithStartSnapshotFunc(echovault.StartSnapshot),
|
snapshot.WithStartSnapshotFunc(echovault.StartSnapshot),
|
||||||
snapshot.WithFinishSnapshotFunc(echovault.FinishSnapshot),
|
snapshot.WithFinishSnapshotFunc(echovault.FinishSnapshot),
|
||||||
snapshot.WithSetLatestSnapshotTimeFunc(echovault.SetLatestSnapshot),
|
snapshot.WithSetLatestSnapshotTimeFunc(echovault.SetLatestSnapshot),
|
||||||
snapshot.WithGetLatestSnapshotTimeFunc(echovault.GetLatestSnapshot),
|
snapshot.WithGetLatestSnapshotTimeFunc(echovault.GetLatestSnapshot),
|
||||||
snapshot.WithSetKeyDataFunc(func(key string, data utils.KeyData) {
|
snapshot.WithGetStateFunc(func() map[string]internal.KeyData {
|
||||||
|
state := make(map[string]internal.KeyData)
|
||||||
|
for k, v := range echovault.getState() {
|
||||||
|
if data, ok := v.(internal.KeyData); ok {
|
||||||
|
state[k] = data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state
|
||||||
|
}),
|
||||||
|
snapshot.WithSetKeyDataFunc(func(key string, data internal.KeyData) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil {
|
if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@@ -173,8 +190,16 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
|
|||||||
aof.WithStrategy(echovault.config.AOFSyncStrategy),
|
aof.WithStrategy(echovault.config.AOFSyncStrategy),
|
||||||
aof.WithStartRewriteFunc(echovault.StartRewriteAOF),
|
aof.WithStartRewriteFunc(echovault.StartRewriteAOF),
|
||||||
aof.WithFinishRewriteFunc(echovault.FinishRewriteAOF),
|
aof.WithFinishRewriteFunc(echovault.FinishRewriteAOF),
|
||||||
aof.WithGetStateFunc(echovault.GetState),
|
aof.WithGetStateFunc(func() map[string]internal.KeyData {
|
||||||
aof.WithSetKeyDataFunc(func(key string, value utils.KeyData) {
|
state := make(map[string]internal.KeyData)
|
||||||
|
for k, v := range echovault.getState() {
|
||||||
|
if data, ok := v.(internal.KeyData); ok {
|
||||||
|
state[k] = data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state
|
||||||
|
}),
|
||||||
|
aof.WithSetKeyDataFunc(func(key string, value internal.KeyData) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil {
|
if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@@ -292,8 +317,8 @@ func (server *EchoVault) handleConnection(conn net.Conn) {
|
|||||||
w, r := io.Writer(conn), io.Reader(conn)
|
w, r := io.Writer(conn), io.Reader(conn)
|
||||||
|
|
||||||
cid := server.connId.Add(1)
|
cid := server.connId.Add(1)
|
||||||
ctx := context.WithValue(server.context, utils.ContextConnID("ConnectionID"),
|
ctx := context.WithValue(server.context, internal.ContextConnID("ConnectionID"),
|
||||||
fmt.Sprintf("%s-%d", server.context.Value(utils.ContextServerID("ServerID")), cid))
|
fmt.Sprintf("%s-%d", server.context.Value(internal.ContextServerID("ServerID")), cid))
|
||||||
|
|
||||||
for {
|
for {
|
||||||
message, err := internal.ReadMessage(r)
|
message, err := internal.ReadMessage(r)
|
||||||
|
@@ -141,7 +141,7 @@ func (server *EchoVault) CreateKeyAndLock(ctx context.Context, key string) (bool
|
|||||||
keyLock.Lock()
|
keyLock.Lock()
|
||||||
server.keyLocks[key] = keyLock
|
server.keyLocks[key] = keyLock
|
||||||
// Create key entry
|
// Create key entry
|
||||||
server.store[key] = utils.KeyData{
|
server.store[key] = internal.KeyData{
|
||||||
Value: nil,
|
Value: nil,
|
||||||
ExpireAt: time.Time{},
|
ExpireAt: time.Time{},
|
||||||
}
|
}
|
||||||
@@ -170,7 +170,7 @@ func (server *EchoVault) SetValue(ctx context.Context, key string, value interfa
|
|||||||
return errors.New("max memory reached, key value not set")
|
return errors.New("max memory reached, key value not set")
|
||||||
}
|
}
|
||||||
|
|
||||||
server.store[key] = utils.KeyData{
|
server.store[key] = internal.KeyData{
|
||||||
Value: value,
|
Value: value,
|
||||||
ExpireAt: server.store[key].ExpireAt,
|
ExpireAt: server.store[key].ExpireAt,
|
||||||
}
|
}
|
||||||
@@ -203,7 +203,7 @@ func (server *EchoVault) GetExpiry(ctx context.Context, key string) time.Time {
|
|||||||
// or the access time on lru eviction policy.
|
// or the access time on lru eviction policy.
|
||||||
// The key must be locked prior to calling this function.
|
// The key must be locked prior to calling this function.
|
||||||
func (server *EchoVault) SetExpiry(ctx context.Context, key string, expireAt time.Time, touch bool) {
|
func (server *EchoVault) SetExpiry(ctx context.Context, key string, expireAt time.Time, touch bool) {
|
||||||
server.store[key] = utils.KeyData{
|
server.store[key] = internal.KeyData{
|
||||||
Value: server.store[key].Value,
|
Value: server.store[key].Value,
|
||||||
ExpireAt: expireAt,
|
ExpireAt: expireAt,
|
||||||
}
|
}
|
||||||
@@ -228,7 +228,7 @@ func (server *EchoVault) SetExpiry(ctx context.Context, key string, expireAt tim
|
|||||||
// The key must be locked prior ro calling this function.
|
// The key must be locked prior ro calling this function.
|
||||||
func (server *EchoVault) RemoveExpiry(key string) {
|
func (server *EchoVault) RemoveExpiry(key string) {
|
||||||
// Reset expiry time
|
// Reset expiry time
|
||||||
server.store[key] = utils.KeyData{
|
server.store[key] = internal.KeyData{
|
||||||
Value: server.store[key].Value,
|
Value: server.store[key].Value,
|
||||||
ExpireAt: time.Time{},
|
ExpireAt: time.Time{},
|
||||||
}
|
}
|
||||||
@@ -245,7 +245,7 @@ func (server *EchoVault) RemoveExpiry(key string) {
|
|||||||
// functions that require a deep copy of the state.
|
// functions that require a deep copy of the state.
|
||||||
// The copy only starts when there's no current copy in progress (represented by stateCopyInProgress atomic boolean)
|
// The copy only starts when there's no current copy in progress (represented by stateCopyInProgress atomic boolean)
|
||||||
// and when there's no current state mutation in progress (represented by stateMutationInProgress atomic boolean)
|
// and when there's no current state mutation in progress (represented by stateMutationInProgress atomic boolean)
|
||||||
func (server *EchoVault) GetState() map[string]utils.KeyData {
|
func (server *EchoVault) getState() map[string]interface{} {
|
||||||
// Wait unit there's no state mutation or copy in progress before starting a new copy process.
|
// Wait unit there's no state mutation or copy in progress before starting a new copy process.
|
||||||
for {
|
for {
|
||||||
if !server.stateCopyInProgress.Load() && !server.stateMutationInProgress.Load() {
|
if !server.stateCopyInProgress.Load() && !server.stateMutationInProgress.Load() {
|
||||||
@@ -253,7 +253,7 @@ func (server *EchoVault) GetState() map[string]utils.KeyData {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data := make(map[string]utils.KeyData)
|
data := make(map[string]interface{})
|
||||||
for k, v := range server.store {
|
for k, v := range server.store {
|
||||||
data[k] = v
|
data[k] = v
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,11 @@ import (
|
|||||||
|
|
||||||
var mockServer *echovault.EchoVault
|
var mockServer *echovault.EchoVault
|
||||||
|
|
||||||
|
type KeyData struct {
|
||||||
|
Value interface{}
|
||||||
|
ExpireAt time.Time
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
mockServer = echovault.NewEchoVault(
|
mockServer = echovault.NewEchoVault(
|
||||||
echovault.WithConfig(config.Config{
|
echovault.WithConfig(config.Config{
|
||||||
@@ -41,7 +46,7 @@ func init() {
|
|||||||
func Test_HandleSET(t *testing.T) {
|
func Test_HandleSET(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
command []string
|
command []string
|
||||||
presetValues map[string]utils.KeyData
|
presetValues map[string]KeyData
|
||||||
expectedResponse interface{}
|
expectedResponse interface{}
|
||||||
expectedValue interface{}
|
expectedValue interface{}
|
||||||
expectedExpiry time.Time
|
expectedExpiry time.Time
|
||||||
@@ -81,7 +86,7 @@ func Test_HandleSET(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 5. Throw error when value already exists with NX flag passed
|
{ // 5. Throw error when value already exists with NX flag passed
|
||||||
command: []string{"SET", "SetKey5", "value5", "NX"},
|
command: []string{"SET", "SetKey5", "value5", "NX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"SetKey5": {
|
"SetKey5": {
|
||||||
Value: "preset-value5",
|
Value: "preset-value5",
|
||||||
ExpireAt: time.Time{},
|
ExpireAt: time.Time{},
|
||||||
@@ -94,7 +99,7 @@ func Test_HandleSET(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 6. Set new key value when key exists with XX flag passed
|
{ // 6. Set new key value when key exists with XX flag passed
|
||||||
command: []string{"SET", "SetKey6", "value6", "XX"},
|
command: []string{"SET", "SetKey6", "value6", "XX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"SetKey6": {
|
"SetKey6": {
|
||||||
Value: "preset-value6",
|
Value: "preset-value6",
|
||||||
ExpireAt: time.Time{},
|
ExpireAt: time.Time{},
|
||||||
@@ -273,7 +278,7 @@ func Test_HandleSET(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 26. Get the previous value when GET flag is passed
|
{ // 26. Get the previous value when GET flag is passed
|
||||||
command: []string{"SET", "SetKey26", "value26", "GET", "EX", "1000"},
|
command: []string{"SET", "SetKey26", "value26", "GET", "EX", "1000"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"SetKey26": {
|
"SetKey26": {
|
||||||
Value: "previous-value",
|
Value: "previous-value",
|
||||||
ExpireAt: time.Time{},
|
ExpireAt: time.Time{},
|
||||||
@@ -617,14 +622,14 @@ func Test_HandleMGET(t *testing.T) {
|
|||||||
func Test_HandleDEL(t *testing.T) {
|
func Test_HandleDEL(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
command []string
|
command []string
|
||||||
presetValues map[string]utils.KeyData
|
presetValues map[string]KeyData
|
||||||
expectedResponse int
|
expectedResponse int
|
||||||
expectToExist map[string]bool
|
expectToExist map[string]bool
|
||||||
expectedErr error
|
expectedErr error
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
command: []string{"DEL", "DelKey1", "DelKey2", "DelKey3", "DelKey4", "DelKey5"},
|
command: []string{"DEL", "DelKey1", "DelKey2", "DelKey3", "DelKey4", "DelKey5"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"DelKey1": {Value: "value1", ExpireAt: time.Time{}},
|
"DelKey1": {Value: "value1", ExpireAt: time.Time{}},
|
||||||
"DelKey2": {Value: "value2", ExpireAt: time.Time{}},
|
"DelKey2": {Value: "value2", ExpireAt: time.Time{}},
|
||||||
"DelKey3": {Value: "value3", ExpireAt: time.Time{}},
|
"DelKey3": {Value: "value3", ExpireAt: time.Time{}},
|
||||||
@@ -701,18 +706,18 @@ func Test_HandleDEL(t *testing.T) {
|
|||||||
func Test_HandlePERSIST(t *testing.T) {
|
func Test_HandlePERSIST(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
command []string
|
command []string
|
||||||
presetValues map[string]utils.KeyData
|
presetValues map[string]KeyData
|
||||||
expectedResponse int
|
expectedResponse int
|
||||||
expectedValues map[string]utils.KeyData
|
expectedValues map[string]KeyData
|
||||||
expectedError error
|
expectedError error
|
||||||
}{
|
}{
|
||||||
{ // 1. Successfully persist a volatile key
|
{ // 1. Successfully persist a volatile key
|
||||||
command: []string{"PERSIST", "PersistKey1"},
|
command: []string{"PERSIST", "PersistKey1"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"PersistKey1": {Value: "value1", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"PersistKey1": {Value: "value1", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"PersistKey1": {Value: "value1", ExpireAt: time.Time{}},
|
"PersistKey1": {Value: "value1", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -726,11 +731,11 @@ func Test_HandlePERSIST(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 3. Return 0 when trying to persist a non-volatile key
|
{ // 3. Return 0 when trying to persist a non-volatile key
|
||||||
command: []string{"PERSIST", "PersistKey3"},
|
command: []string{"PERSIST", "PersistKey3"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"PersistKey3": {Value: "value3", ExpireAt: time.Time{}},
|
"PersistKey3": {Value: "value3", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"PersistKey3": {Value: "value3", ExpireAt: time.Time{}},
|
"PersistKey3": {Value: "value3", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -815,13 +820,13 @@ func Test_HandlePERSIST(t *testing.T) {
|
|||||||
func Test_HandleEXPIRETIME(t *testing.T) {
|
func Test_HandleEXPIRETIME(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
command []string
|
command []string
|
||||||
presetValues map[string]utils.KeyData
|
presetValues map[string]KeyData
|
||||||
expectedResponse int
|
expectedResponse int
|
||||||
expectedError error
|
expectedError error
|
||||||
}{
|
}{
|
||||||
{ // 1. Return expire time in seconds
|
{ // 1. Return expire time in seconds
|
||||||
command: []string{"EXPIRETIME", "ExpireTimeKey1"},
|
command: []string{"EXPIRETIME", "ExpireTimeKey1"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireTimeKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
|
"ExpireTimeKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: int(timeNow().Add(100 * time.Second).Unix()),
|
expectedResponse: int(timeNow().Add(100 * time.Second).Unix()),
|
||||||
@@ -829,7 +834,7 @@ func Test_HandleEXPIRETIME(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 2. Return expire time in milliseconds
|
{ // 2. Return expire time in milliseconds
|
||||||
command: []string{"PEXPIRETIME", "ExpireTimeKey2"},
|
command: []string{"PEXPIRETIME", "ExpireTimeKey2"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireTimeKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)},
|
"ExpireTimeKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)},
|
||||||
},
|
},
|
||||||
expectedResponse: int(timeNow().Add(4096 * time.Millisecond).UnixMilli()),
|
expectedResponse: int(timeNow().Add(4096 * time.Millisecond).UnixMilli()),
|
||||||
@@ -837,7 +842,7 @@ func Test_HandleEXPIRETIME(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 3. If the key is non-volatile, return -1
|
{ // 3. If the key is non-volatile, return -1
|
||||||
command: []string{"PEXPIRETIME", "ExpireTimeKey3"},
|
command: []string{"PEXPIRETIME", "ExpireTimeKey3"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireTimeKey3": {Value: "value3", ExpireAt: time.Time{}},
|
"ExpireTimeKey3": {Value: "value3", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: -1,
|
expectedResponse: -1,
|
||||||
@@ -908,13 +913,13 @@ func Test_HandleEXPIRETIME(t *testing.T) {
|
|||||||
func Test_HandleTTL(t *testing.T) {
|
func Test_HandleTTL(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
command []string
|
command []string
|
||||||
presetValues map[string]utils.KeyData
|
presetValues map[string]KeyData
|
||||||
expectedResponse int
|
expectedResponse int
|
||||||
expectedError error
|
expectedError error
|
||||||
}{
|
}{
|
||||||
{ // 1. Return TTL time in seconds
|
{ // 1. Return TTL time in seconds
|
||||||
command: []string{"TTL", "TTLKey1"},
|
command: []string{"TTL", "TTLKey1"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"TTLKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
|
"TTLKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 100,
|
expectedResponse: 100,
|
||||||
@@ -922,7 +927,7 @@ func Test_HandleTTL(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 2. Return TTL time in milliseconds
|
{ // 2. Return TTL time in milliseconds
|
||||||
command: []string{"PTTL", "TTLKey2"},
|
command: []string{"PTTL", "TTLKey2"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"TTLKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)},
|
"TTLKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)},
|
||||||
},
|
},
|
||||||
expectedResponse: 4096,
|
expectedResponse: 4096,
|
||||||
@@ -930,7 +935,7 @@ func Test_HandleTTL(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // 3. If the key is non-volatile, return -1
|
{ // 3. If the key is non-volatile, return -1
|
||||||
command: []string{"TTL", "TTLKey3"},
|
command: []string{"TTL", "TTLKey3"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"TTLKey3": {Value: "value3", ExpireAt: time.Time{}},
|
"TTLKey3": {Value: "value3", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: -1,
|
expectedResponse: -1,
|
||||||
@@ -1001,146 +1006,146 @@ func Test_HandleTTL(t *testing.T) {
|
|||||||
func Test_HandleEXPIRE(t *testing.T) {
|
func Test_HandleEXPIRE(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
command []string
|
command []string
|
||||||
presetValues map[string]utils.KeyData
|
presetValues map[string]KeyData
|
||||||
expectedResponse int
|
expectedResponse int
|
||||||
expectedValues map[string]utils.KeyData
|
expectedValues map[string]KeyData
|
||||||
expectedError error
|
expectedError error
|
||||||
}{
|
}{
|
||||||
{ // 1. Set new expire by seconds
|
{ // 1. Set new expire by seconds
|
||||||
command: []string{"EXPIRE", "ExpireKey1", "100"},
|
command: []string{"EXPIRE", "ExpireKey1", "100"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey1": {Value: "value1", ExpireAt: time.Time{}},
|
"ExpireKey1": {Value: "value1", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
|
"ExpireKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 2. Set new expire by milliseconds
|
{ // 2. Set new expire by milliseconds
|
||||||
command: []string{"PEXPIRE", "ExpireKey2", "1000"},
|
command: []string{"PEXPIRE", "ExpireKey2", "1000"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey2": {Value: "value2", ExpireAt: time.Time{}},
|
"ExpireKey2": {Value: "value2", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey2": {Value: "value2", ExpireAt: timeNow().Add(1000 * time.Millisecond)},
|
"ExpireKey2": {Value: "value2", ExpireAt: timeNow().Add(1000 * time.Millisecond)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 3. Set new expire only when key does not have an expiry time with NX flag
|
{ // 3. Set new expire only when key does not have an expiry time with NX flag
|
||||||
command: []string{"EXPIRE", "ExpireKey3", "1000", "NX"},
|
command: []string{"EXPIRE", "ExpireKey3", "1000", "NX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey3": {Value: "value3", ExpireAt: time.Time{}},
|
"ExpireKey3": {Value: "value3", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey3": {Value: "value3", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireKey3": {Value: "value3", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 4. Return 0, when NX flag is provided and key already has an expiry time
|
{ // 4. Return 0, when NX flag is provided and key already has an expiry time
|
||||||
command: []string{"EXPIRE", "ExpireKey4", "1000", "NX"},
|
command: []string{"EXPIRE", "ExpireKey4", "1000", "NX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 5. Set new expire time from now key only when the key already has an expiry time with XX flag
|
{ // 5. Set new expire time from now key only when the key already has an expiry time with XX flag
|
||||||
command: []string{"EXPIRE", "ExpireKey5", "1000", "XX"},
|
command: []string{"EXPIRE", "ExpireKey5", "1000", "XX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)},
|
"ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 6. Return 0 when key does not have an expiry and the XX flag is provided
|
{ // 6. Return 0 when key does not have an expiry and the XX flag is provided
|
||||||
command: []string{"EXPIRE", "ExpireKey6", "1000", "XX"},
|
command: []string{"EXPIRE", "ExpireKey6", "1000", "XX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey6": {Value: "value6", ExpireAt: time.Time{}},
|
"ExpireKey6": {Value: "value6", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey6": {Value: "value6", ExpireAt: time.Time{}},
|
"ExpireKey6": {Value: "value6", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 7. Set expiry time when the provided time is after the current expiry time when GT flag is provided
|
{ // 7. Set expiry time when the provided time is after the current expiry time when GT flag is provided
|
||||||
command: []string{"EXPIRE", "ExpireKey7", "1000", "GT"},
|
command: []string{"EXPIRE", "ExpireKey7", "1000", "GT"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)},
|
"ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 8. Return 0 when GT flag is passed and current expiry time is greater than provided time
|
{ // 8. Return 0 when GT flag is passed and current expiry time is greater than provided time
|
||||||
command: []string{"EXPIRE", "ExpireKey8", "1000", "GT"},
|
command: []string{"EXPIRE", "ExpireKey8", "1000", "GT"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 9. Return 0 when GT flag is passed and key does not have an expiry time
|
{ // 9. Return 0 when GT flag is passed and key does not have an expiry time
|
||||||
command: []string{"EXPIRE", "ExpireKey9", "1000", "GT"},
|
command: []string{"EXPIRE", "ExpireKey9", "1000", "GT"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey9": {Value: "value9", ExpireAt: time.Time{}},
|
"ExpireKey9": {Value: "value9", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey9": {Value: "value9", ExpireAt: time.Time{}},
|
"ExpireKey9": {Value: "value9", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 10. Set expiry time when the provided time is before the current expiry time when LT flag is provided
|
{ // 10. Set expiry time when the provided time is before the current expiry time when LT flag is provided
|
||||||
command: []string{"EXPIRE", "ExpireKey10", "1000", "LT"},
|
command: []string{"EXPIRE", "ExpireKey10", "1000", "LT"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 11. Return 0 when LT flag is passed and current expiry time is less than provided time
|
{ // 11. Return 0 when LT flag is passed and current expiry time is less than provided time
|
||||||
command: []string{"EXPIRE", "ExpireKey11", "5000", "LT"},
|
command: []string{"EXPIRE", "ExpireKey11", "5000", "LT"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 12. Return 0 when LT flag is passed and key does not have an expiry time
|
{ // 12. Return 0 when LT flag is passed and key does not have an expiry time
|
||||||
command: []string{"EXPIRE", "ExpireKey12", "1000", "LT"},
|
command: []string{"EXPIRE", "ExpireKey12", "1000", "LT"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey12": {Value: "value12", ExpireAt: time.Time{}},
|
"ExpireKey12": {Value: "value12", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireKey12": {Value: "value12", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireKey12": {Value: "value12", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 13. Return error when unknown flag is passed
|
{ // 13. Return error when unknown flag is passed
|
||||||
command: []string{"EXPIRE", "ExpireKey13", "1000", "UNKNOWN"},
|
command: []string{"EXPIRE", "ExpireKey13", "1000", "UNKNOWN"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireKey13": {Value: "value13", ExpireAt: time.Time{}},
|
"ExpireKey13": {Value: "value13", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
@@ -1234,51 +1239,51 @@ func Test_HandleEXPIRE(t *testing.T) {
|
|||||||
func Test_HandleEXPIREAT(t *testing.T) {
|
func Test_HandleEXPIREAT(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
command []string
|
command []string
|
||||||
presetValues map[string]utils.KeyData
|
presetValues map[string]KeyData
|
||||||
expectedResponse int
|
expectedResponse int
|
||||||
expectedValues map[string]utils.KeyData
|
expectedValues map[string]KeyData
|
||||||
expectedError error
|
expectedError error
|
||||||
}{
|
}{
|
||||||
{ // 1. Set new expire by unix seconds
|
{ // 1. Set new expire by unix seconds
|
||||||
command: []string{"EXPIREAT", "ExpireAtKey1", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix())},
|
command: []string{"EXPIREAT", "ExpireAtKey1", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix())},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey1": {Value: "value1", ExpireAt: time.Time{}},
|
"ExpireAtKey1": {Value: "value1", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey1": {Value: "value1", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
"ExpireAtKey1": {Value: "value1", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 2. Set new expire by milliseconds
|
{ // 2. Set new expire by milliseconds
|
||||||
command: []string{"PEXPIREAT", "ExpireAtKey2", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).UnixMilli())},
|
command: []string{"PEXPIREAT", "ExpireAtKey2", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).UnixMilli())},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey2": {Value: "value2", ExpireAt: time.Time{}},
|
"ExpireAtKey2": {Value: "value2", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey2": {Value: "value2", ExpireAt: time.UnixMilli(timeNow().Add(1000 * time.Second).UnixMilli())},
|
"ExpireAtKey2": {Value: "value2", ExpireAt: time.UnixMilli(timeNow().Add(1000 * time.Second).UnixMilli())},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 3. Set new expire only when key does not have an expiry time with NX flag
|
{ // 3. Set new expire only when key does not have an expiry time with NX flag
|
||||||
command: []string{"EXPIREAT", "ExpireAtKey3", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"},
|
command: []string{"EXPIREAT", "ExpireAtKey3", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey3": {Value: "value3", ExpireAt: time.Time{}},
|
"ExpireAtKey3": {Value: "value3", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey3": {Value: "value3", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
"ExpireAtKey3": {Value: "value3", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 4. Return 0, when NX flag is provided and key already has an expiry time
|
{ // 4. Return 0, when NX flag is provided and key already has an expiry time
|
||||||
command: []string{"EXPIREAT", "ExpireAtKey4", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"},
|
command: []string{"EXPIREAT", "ExpireAtKey4", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1288,11 +1293,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey5",
|
"EXPIREAT", "ExpireAtKey5",
|
||||||
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX",
|
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)},
|
"ExpireAtKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey5": {Value: "value5", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
"ExpireAtKey5": {Value: "value5", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1302,11 +1307,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey6",
|
"EXPIREAT", "ExpireAtKey6",
|
||||||
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX",
|
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}},
|
"ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}},
|
"ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1316,11 +1321,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey7",
|
"EXPIREAT", "ExpireAtKey7",
|
||||||
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
|
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)},
|
"ExpireAtKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey7": {Value: "value7", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
"ExpireAtKey7": {Value: "value7", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1330,11 +1335,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey8",
|
"EXPIREAT", "ExpireAtKey8",
|
||||||
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
|
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1344,11 +1349,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey9",
|
"EXPIREAT", "ExpireAtKey9",
|
||||||
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
|
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}},
|
"ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}},
|
"ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1358,11 +1363,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey10",
|
"EXPIREAT", "ExpireAtKey10",
|
||||||
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT",
|
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)},
|
"ExpireAtKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey10": {Value: "value10", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
"ExpireAtKey10": {Value: "value10", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1372,11 +1377,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey11",
|
"EXPIREAT", "ExpireAtKey11",
|
||||||
fmt.Sprintf("%d", timeNow().Add(3000*time.Second).Unix()), "LT",
|
fmt.Sprintf("%d", timeNow().Add(3000*time.Second).Unix()), "LT",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)},
|
"ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
@@ -1386,18 +1391,18 @@ func Test_HandleEXPIREAT(t *testing.T) {
|
|||||||
"EXPIREAT", "ExpireAtKey12",
|
"EXPIREAT", "ExpireAtKey12",
|
||||||
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT",
|
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT",
|
||||||
},
|
},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey12": {Value: "value12", ExpireAt: time.Time{}},
|
"ExpireAtKey12": {Value: "value12", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 1,
|
expectedResponse: 1,
|
||||||
expectedValues: map[string]utils.KeyData{
|
expectedValues: map[string]KeyData{
|
||||||
"ExpireAtKey12": {Value: "value12", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
"ExpireAtKey12": {Value: "value12", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
|
||||||
},
|
},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{ // 13. Return error when unknown flag is passed
|
{ // 13. Return error when unknown flag is passed
|
||||||
command: []string{"EXPIREAT", "ExpireAtKey13", "1000", "UNKNOWN"},
|
command: []string{"EXPIREAT", "ExpireAtKey13", "1000", "UNKNOWN"},
|
||||||
presetValues: map[string]utils.KeyData{
|
presetValues: map[string]KeyData{
|
||||||
"ExpireAtKey13": {Value: "value13", ExpireAt: time.Time{}},
|
"ExpireAtKey13": {Value: "value13", ExpireAt: time.Time{}},
|
||||||
},
|
},
|
||||||
expectedResponse: 0,
|
expectedResponse: 0,
|
||||||
|
@@ -20,12 +20,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// KeyData holds the structure of the in-memory data stored at a string key.
|
|
||||||
type KeyData struct {
|
|
||||||
Value interface{}
|
|
||||||
ExpireAt time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
type EchoVault interface {
|
type EchoVault interface {
|
||||||
KeyLock(ctx context.Context, key string) (bool, error)
|
KeyLock(ctx context.Context, key string) (bool, error)
|
||||||
KeyUnlock(ctx context.Context, key string)
|
KeyUnlock(ctx context.Context, key string)
|
||||||
@@ -39,7 +33,6 @@ type EchoVault interface {
|
|||||||
SetExpiry(ctx context.Context, key string, expire time.Time, touch bool)
|
SetExpiry(ctx context.Context, key string, expire time.Time, touch bool)
|
||||||
RemoveExpiry(key string)
|
RemoveExpiry(key string)
|
||||||
DeleteKey(ctx context.Context, key string) error
|
DeleteKey(ctx context.Context, key string) error
|
||||||
GetState() map[string]KeyData
|
|
||||||
GetAllCommands() []Command
|
GetAllCommands() []Command
|
||||||
GetACL() interface{}
|
GetACL() interface{}
|
||||||
GetPubSub() interface{}
|
GetPubSub() interface{}
|
||||||
@@ -51,22 +44,6 @@ type EchoVault interface {
|
|||||||
RewriteAOF() error
|
RewriteAOF() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContextServerID string
|
|
||||||
type ContextConnID string
|
|
||||||
|
|
||||||
type ApplyRequest struct {
|
|
||||||
Type string `json:"Type"` // command | delete-key
|
|
||||||
ServerID string `json:"ServerID"`
|
|
||||||
ConnectionID string `json:"ConnectionID"`
|
|
||||||
CMD []string `json:"CMD"`
|
|
||||||
Key string `json:"Key"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApplyResponse struct {
|
|
||||||
Error error
|
|
||||||
Response []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type KeyExtractionFunc func(cmd []string) ([]string, error)
|
type KeyExtractionFunc func(cmd []string) ([]string, error)
|
||||||
type HandlerFunc func(ctx context.Context, cmd []string, echovault EchoVault, conn *net.Conn) ([]byte, error)
|
type HandlerFunc func(ctx context.Context, cmd []string, echovault EchoVault, conn *net.Conn) ([]byte, error)
|
||||||
|
|
||||||
@@ -95,8 +72,3 @@ type ACL interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PubSub interface{}
|
type PubSub interface{}
|
||||||
|
|
||||||
type SnapshotObject struct {
|
|
||||||
State map[string]KeyData
|
|
||||||
LatestSnapshotMilliseconds int64
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user