From 820295315bb6f412895f75f6c7c7fcab3d3c75ef Mon Sep 17 00:00:00 2001 From: ZigBalthazar Date: Sun, 15 Sep 2024 00:46:42 +0330 Subject: [PATCH] feat: init database and basic models --- cmd/commands/run.go | 6 +- config/config.go | 1 + database/database.go | 25 + database/migrations/000001_init.down.sql | 15 + database/migrations/000001_init.up.sql | 73 + docker-compose.yml | 11 + documents/erd/.immortal-erd.vpp.lck | 0 documents/erd/immortal-erd.vpp | Bin 684032 -> 700416 bytes documents/erd/immortal-erd.vpp.bak_001d | Bin 0 -> 217088 bytes documents/erd/immortal-erd.vpp.bak_002d | Bin 0 -> 200704 bytes go.mod | 11 + go.sum | 976 +++++++++- makefile | 14 + models/boil_queries.go | 38 + models/boil_table_names.go | 18 + models/boil_types.go | 52 + models/boil_view_names.go | 7 + models/follow_list.go | 1529 ++++++++++++++++ models/psql_upsert.go | 99 ++ models/reactions.go | 1687 ++++++++++++++++++ models/schema_migrations.go | 1050 +++++++++++ models/text_notes.go | 1627 +++++++++++++++++ models/users_metadata.go | 2078 ++++++++++++++++++++++ relay/relay.go | 24 +- sqlboiler.yml | 39 + 25 files changed, 9370 insertions(+), 10 deletions(-) create mode 100644 database/database.go create mode 100644 database/migrations/000001_init.down.sql create mode 100644 database/migrations/000001_init.up.sql create mode 100644 docker-compose.yml delete mode 100644 documents/erd/.immortal-erd.vpp.lck create mode 100644 documents/erd/immortal-erd.vpp.bak_001d create mode 100644 documents/erd/immortal-erd.vpp.bak_002d create mode 100644 models/boil_queries.go create mode 100644 models/boil_table_names.go create mode 100644 models/boil_types.go create mode 100644 models/boil_view_names.go create mode 100644 models/follow_list.go create mode 100644 models/psql_upsert.go create mode 100644 models/reactions.go create mode 100644 models/schema_migrations.go create mode 100644 models/text_notes.go create mode 100644 models/users_metadata.go create mode 100644 sqlboiler.yml diff --git a/cmd/commands/run.go b/cmd/commands/run.go index f840eba..6eac71d 100644 --- a/cmd/commands/run.go +++ b/cmd/commands/run.go @@ -20,7 +20,11 @@ func HandleRun(args []string) { ExitOnError(err) } - r := relay.NewRelay(*cfg) + r, err := relay.New(*cfg) + if err != nil { + ExitOnError(err) + } + if err := r.Start(); err != nil { ExitOnError(err) } diff --git a/config/config.go b/config/config.go index 047ee29..d164f04 100644 --- a/config/config.go +++ b/config/config.go @@ -11,6 +11,7 @@ import ( type Config struct { ServerConf server.Config `yaml:"server"` DSN string + // TODO ::: db connection pool config } // LoadfromFile loads config from file, databse and env. diff --git a/database/database.go b/database/database.go new file mode 100644 index 0000000..af1e27c --- /dev/null +++ b/database/database.go @@ -0,0 +1,25 @@ +package database + +import ( + "database/sql" + + _ "github.com/lib/pq" // no-lint + "github.com/volatiletech/sqlboiler/v4/boil" +) + +type Database struct { + db *sql.DB +} + +func New(dsn string) (*Database, error) { + db, err := sql.Open("postgres", dsn) + if err != nil { + return nil, err + } + + boil.SetDB(db) + // TODO ::: config the connection pool + return &Database{ + db: db, + }, nil +} diff --git a/database/migrations/000001_init.down.sql b/database/migrations/000001_init.down.sql new file mode 100644 index 0000000..b5981b4 --- /dev/null +++ b/database/migrations/000001_init.down.sql @@ -0,0 +1,15 @@ +-- Drop foreign key constraints first +ALTER TABLE public.reactions DROP CONSTRAINT IF EXISTS FKreactions_users_metadata; +ALTER TABLE public.reactions DROP CONSTRAINT IF EXISTS FKreactions_text_notes; +ALTER TABLE public.follow_list DROP CONSTRAINT IF EXISTS FKfollow_list_following; +ALTER TABLE public.follow_list DROP CONSTRAINT IF EXISTS FKfollow_list_follower; +ALTER TABLE public.text_notes DROP CONSTRAINT IF EXISTS FKtext_notes_users_metadata; + +-- Drop indexes +DROP INDEX IF EXISTS public.reactions_text_notesid; + +-- Drop tables +DROP TABLE IF EXISTS public.follow_list CASCADE; +DROP TABLE IF EXISTS public.reactions CASCADE; +DROP TABLE IF EXISTS public.text_notes CASCADE; +DROP TABLE IF EXISTS public.users_metadata CASCADE; diff --git a/database/migrations/000001_init.up.sql b/database/migrations/000001_init.up.sql new file mode 100644 index 0000000..9b96dc1 --- /dev/null +++ b/database/migrations/000001_init.up.sql @@ -0,0 +1,73 @@ +BEGIN; + +CREATE TABLE public.follow_list ( + follower CHAR(32), -- Optional, so no NOT NULL + following CHAR(32), -- Optional, so no NOT NULL + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- You may need a trigger for automatic updates + deleted_at TIMESTAMP, + PRIMARY KEY (follower, following), + CONSTRAINT follower_following UNIQUE (follower, following) +); + +CREATE TABLE public.reactions ( + id UUID NOT NULL, + text_notesid UUID, -- Optional, so no NOT NULL + users_metadatapub_key CHAR(32), -- Optional, so no NOT NULL + e TEXT[], -- Assuming e is an array of text + p TEXT[], -- Assuming p is an array of text + a TEXT[], -- Assuming a is an array of text + event JSONB NOT NULL, + k TEXT[], -- Assuming k is an array of text + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted_at TIMESTAMP, + PRIMARY KEY (id) +); + +CREATE TABLE public.text_notes ( + id UUID NOT NULL, + e TEXT[], -- Assuming e is an array of text + p TEXT[], -- Assuming p is an array of text + content VARCHAR(65535), + event JSONB NOT NULL UNIQUE, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted_at TIMESTAMP, + users_metadatapub_key CHAR(32), -- Optional, so no NOT NULL + PRIMARY KEY (id) +); + +CREATE TABLE public.users_metadata ( + pub_key CHAR(32) NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted_at TIMESTAMP, + content VARCHAR(255), + follow_list_event JSONB, + PRIMARY KEY (pub_key) +); + +-- Index for better query performance +CREATE INDEX reactions_text_notesid ON public.reactions (text_notesid); + +-- Foreign key constraints with optional references +ALTER TABLE public.reactions + ADD CONSTRAINT FKreactions_users_metadata + FOREIGN KEY (users_metadatapub_key) REFERENCES public.users_metadata (pub_key); + +ALTER TABLE public.follow_list + ADD CONSTRAINT FKfollow_list_following + FOREIGN KEY (following) REFERENCES public.users_metadata (pub_key), + ADD CONSTRAINT FKfollow_list_follower + FOREIGN KEY (follower) REFERENCES public.users_metadata (pub_key); + +ALTER TABLE public.reactions + ADD CONSTRAINT FKreactions_text_notes + FOREIGN KEY (text_notesid) REFERENCES public.text_notes (id); + +ALTER TABLE public.text_notes + ADD CONSTRAINT FKtext_notes_users_metadata + FOREIGN KEY (users_metadatapub_key) REFERENCES public.users_metadata (pub_key); + +COMMIT; \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1420866 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +version: '3.8' + +services: + postgres: + image: postgres:15 + environment: + POSTGRES_USER: dev_user + POSTGRES_PASSWORD: dev_password + POSTGRES_DB: dev_db + ports: + - "5432:5432" diff --git a/documents/erd/.immortal-erd.vpp.lck b/documents/erd/.immortal-erd.vpp.lck deleted file mode 100644 index e69de29..0000000 diff --git a/documents/erd/immortal-erd.vpp b/documents/erd/immortal-erd.vpp index b427f82e2979649eb8948bb01f7aa0ef9098b6ff..ec172434d6869f2e762f7eb84dbe361e5dc23762 100644 GIT binary patch delta 29850 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%0D()9 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ℑ3G5OlKk$;TF)yx) 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 Iiiw`~|A%A3xBvhE literal 0 HcmV?d00001 diff --git a/documents/erd/immortal-erd.vpp.bak_002d b/documents/erd/immortal-erd.vpp.bak_002d new file mode 100644 index 0000000000000000000000000000000000000000..e5c52b0218e2b28ca323faea78957998b0124b68 GIT binary patch literal 200704 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 z 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index 785fbf1..617fbfa 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,14 @@ go 1.22.5 require ( github.com/btcsuite/btcd/btcec/v2 v2.3.4 + github.com/friendsofgo/errors v0.9.2 + github.com/lib/pq v1.10.9 github.com/mailru/easyjson v0.7.7 github.com/stretchr/testify v1.9.0 github.com/tidwall/gjson v1.17.3 + github.com/volatiletech/null/v8 v8.1.2 + github.com/volatiletech/sqlboiler/v4 v4.16.2 + github.com/volatiletech/strmangle v0.0.6 golang.org/x/net v0.29.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -16,8 +21,14 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/ericlagergren/decimal v0.0.0-20190420051523-6335edbaa640 // indirect + github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/josharian/intern v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/spf13/cast v1.5.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect + github.com/volatiletech/inflect v0.0.1 // indirect + github.com/volatiletech/randomize v0.0.1 // indirect + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect ) diff --git a/go.sum b/go.sum index 0aa1fcd..06b02d3 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,1004 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1MRDJM= +github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apmckinlay/gsuneido v0.0.0-20190404155041-0b6cd442a18f/go.mod h1:JU2DOj5Fc6rol0yaT79Csr47QR0vONGwJtBNGRD7jmc= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ericlagergren/decimal v0.0.0-20190420051523-6335edbaa640 h1:VMAacqPM03GapxpfNORtKNl9o6Uws1BQYL54WjmolN0= +github.com/ericlagergren/decimal v0.0.0-20190420051523-6335edbaa640/go.mod h1:mdYyfAkzn9kyJ/kMk/7WE9ufl9lflh+2NvecQ5mAghs= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/friendsofgo/errors v0.9.2 h1:X6NYxef4efCBdwI7BgS820zFaN7Cphrmb+Pljdzjtgk= +github.com/friendsofgo/errors v0.9.2/go.mod h1:yCvFW5AkDIL9qn7suHVLiI/gH228n7PC4Pn44IGoTOI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kat-co/vala v0.0.0-20170210184112-42e1d8b61f12/go.mod h1:u9MdXq/QageOOSGp7qG4XAQsYUMP+V5zEel/Vrl6OOc= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/volatiletech/inflect v0.0.1 h1:2a6FcMQyhmPZcLa+uet3VJ8gLn/9svWhJxJYwvE8KsU= +github.com/volatiletech/inflect v0.0.1/go.mod h1:IBti31tG6phkHitLlr5j7shC5SOo//x0AjDzaJU1PLA= +github.com/volatiletech/null/v8 v8.1.2 h1:kiTiX1PpwvuugKwfvUNX/SU/5A2KGZMXfGD0DUHdKEI= +github.com/volatiletech/null/v8 v8.1.2/go.mod h1:98DbwNoKEpRrYtGjWFctievIfm4n4MxG0A6EBUcoS5g= +github.com/volatiletech/randomize v0.0.1 h1:eE5yajattWqTB2/eN8df4dw+8jwAzBtbdo5sbWC4nMk= +github.com/volatiletech/randomize v0.0.1/go.mod h1:GN3U0QYqfZ9FOJ67bzax1cqZ5q2xuj2mXrXBjWaRTlY= +github.com/volatiletech/sqlboiler/v4 v4.16.2 h1:PcV2bxjE+S+GwPKCyX7/AjlY3aiTKsOEjciLhpWQImc= +github.com/volatiletech/sqlboiler/v4 v4.16.2/go.mod h1:B14BPBGTrJ2X6l7lwnvV/iXgYR48+ozGSlzHI3frl6U= +github.com/volatiletech/strmangle v0.0.1/go.mod h1:F6RA6IkB5vq0yTG4GQ0UsbbRcl3ni9P76i+JrTBKFFg= +github.com/volatiletech/strmangle v0.0.6 h1:AdOYE3B2ygRDq4rXDij/MMwq6KVK/pWAYxpC7CLrkKQ= +github.com/volatiletech/strmangle v0.0.6/go.mod h1:ycDvbDkjDvhC0NUU8w3fWwl5JEMTV56vTKXzR3GeR+0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/makefile b/makefile index c26337b..186940a 100644 --- a/makefile +++ b/makefile @@ -5,6 +5,9 @@ devtools: @echo "Installing devtools" go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest go install mvdan.cc/gofumpt@latest + # TODO ::: go-migrate + # TODO ::: sqlboiler + # TODO ::: psql driver ### Testing unit-test: @@ -32,4 +35,15 @@ build: pre-commit: fmt check unit-test @echo ready to commit... +### docker-compose +compose-up: + docker-compose up -d + +compose-down: + docker-compose down + +### sqlBoiler + models-generate: + sqlboiler psql + .PHONY: build diff --git a/models/boil_queries.go b/models/boil_queries.go new file mode 100644 index 0000000..20c2563 --- /dev/null +++ b/models/boil_queries.go @@ -0,0 +1,38 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "regexp" + + "github.com/volatiletech/sqlboiler/v4/drivers" + "github.com/volatiletech/sqlboiler/v4/queries" + "github.com/volatiletech/sqlboiler/v4/queries/qm" +) + +var dialect = drivers.Dialect{ + LQ: 0x22, + RQ: 0x22, + + UseIndexPlaceholders: true, + UseLastInsertID: false, + UseSchema: false, + UseDefaultKeyword: true, + UseAutoColumns: false, + UseTopClause: false, + UseOutputClause: false, + UseCaseWhenExistsClause: false, +} + +// This is a dummy variable to prevent unused regexp import error +var _ = ®exp.Regexp{} + +// NewQuery initializes a new Query using the passed in QueryMods +func NewQuery(mods ...qm.QueryMod) *queries.Query { + q := &queries.Query{} + queries.SetDialect(q, &dialect) + qm.Apply(q, mods...) + + return q +} diff --git a/models/boil_table_names.go b/models/boil_table_names.go new file mode 100644 index 0000000..a3925d1 --- /dev/null +++ b/models/boil_table_names.go @@ -0,0 +1,18 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +var TableNames = struct { + FollowList string + Reactions string + SchemaMigrations string + TextNotes string + UsersMetadata string +}{ + FollowList: "follow_list", + Reactions: "reactions", + SchemaMigrations: "schema_migrations", + TextNotes: "text_notes", + UsersMetadata: "users_metadata", +} diff --git a/models/boil_types.go b/models/boil_types.go new file mode 100644 index 0000000..02a6fdf --- /dev/null +++ b/models/boil_types.go @@ -0,0 +1,52 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "strconv" + + "github.com/friendsofgo/errors" + "github.com/volatiletech/sqlboiler/v4/boil" + "github.com/volatiletech/strmangle" +) + +// M type is for providing columns and column values to UpdateAll. +type M map[string]interface{} + +// ErrSyncFail occurs during insert when the record could not be retrieved in +// order to populate default value information. This usually happens when LastInsertId +// fails or there was a primary key configuration that was not resolvable. +var ErrSyncFail = errors.New("models: failed to synchronize data after insert") + +type insertCache struct { + query string + retQuery string + valueMapping []uint64 + retMapping []uint64 +} + +type updateCache struct { + query string + valueMapping []uint64 +} + +func makeCacheKey(cols boil.Columns, nzDefaults []string) string { + buf := strmangle.GetBuffer() + + buf.WriteString(strconv.Itoa(cols.Kind)) + for _, w := range cols.Cols { + buf.WriteString(w) + } + + if len(nzDefaults) != 0 { + buf.WriteByte('.') + } + for _, nz := range nzDefaults { + buf.WriteString(nz) + } + + str := buf.String() + strmangle.PutBuffer(buf) + return str +} diff --git a/models/boil_view_names.go b/models/boil_view_names.go new file mode 100644 index 0000000..01504d8 --- /dev/null +++ b/models/boil_view_names.go @@ -0,0 +1,7 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +var ViewNames = struct { +}{} diff --git a/models/follow_list.go b/models/follow_list.go new file mode 100644 index 0000000..5d837c9 --- /dev/null +++ b/models/follow_list.go @@ -0,0 +1,1529 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "context" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/friendsofgo/errors" + "github.com/volatiletech/null/v8" + "github.com/volatiletech/sqlboiler/v4/boil" + "github.com/volatiletech/sqlboiler/v4/queries" + "github.com/volatiletech/sqlboiler/v4/queries/qm" + "github.com/volatiletech/sqlboiler/v4/queries/qmhelper" + "github.com/volatiletech/strmangle" +) + +// FollowList is an object representing the database table. +type FollowList struct { + Follower string `boil:"follower" json:"follower" toml:"follower" yaml:"follower"` + Following string `boil:"following" json:"following" toml:"following" yaml:"following"` + CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"` + UpdatedAt time.Time `boil:"updated_at" json:"updated_at" toml:"updated_at" yaml:"updated_at"` + DeletedAt null.Time `boil:"deleted_at" json:"deleted_at,omitempty" toml:"deleted_at" yaml:"deleted_at,omitempty"` + + R *followListR `boil:"-" json:"-" toml:"-" yaml:"-"` + L followListL `boil:"-" json:"-" toml:"-" yaml:"-"` +} + +var FollowListColumns = struct { + Follower string + Following string + CreatedAt string + UpdatedAt string + DeletedAt string +}{ + Follower: "follower", + Following: "following", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +var FollowListTableColumns = struct { + Follower string + Following string + CreatedAt string + UpdatedAt string + DeletedAt string +}{ + Follower: "follow_list.follower", + Following: "follow_list.following", + CreatedAt: "follow_list.created_at", + UpdatedAt: "follow_list.updated_at", + DeletedAt: "follow_list.deleted_at", +} + +// Generated where + +type whereHelperstring struct{ field string } + +func (w whereHelperstring) EQ(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.EQ, x) } +func (w whereHelperstring) NEQ(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.NEQ, x) } +func (w whereHelperstring) LT(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LT, x) } +func (w whereHelperstring) LTE(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LTE, x) } +func (w whereHelperstring) GT(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GT, x) } +func (w whereHelperstring) GTE(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GTE, x) } +func (w whereHelperstring) LIKE(x string) qm.QueryMod { return qm.Where(w.field+" LIKE ?", x) } +func (w whereHelperstring) NLIKE(x string) qm.QueryMod { return qm.Where(w.field+" NOT LIKE ?", x) } +func (w whereHelperstring) ILIKE(x string) qm.QueryMod { return qm.Where(w.field+" ILIKE ?", x) } +func (w whereHelperstring) NILIKE(x string) qm.QueryMod { return qm.Where(w.field+" NOT ILIKE ?", x) } +func (w whereHelperstring) IN(slice []string) qm.QueryMod { + values := make([]interface{}, 0, len(slice)) + for _, value := range slice { + values = append(values, value) + } + return qm.WhereIn(fmt.Sprintf("%s IN ?", w.field), values...) +} +func (w whereHelperstring) NIN(slice []string) qm.QueryMod { + values := make([]interface{}, 0, len(slice)) + for _, value := range slice { + values = append(values, value) + } + return qm.WhereNotIn(fmt.Sprintf("%s NOT IN ?", w.field), values...) +} + +type whereHelpertime_Time struct{ field string } + +func (w whereHelpertime_Time) EQ(x time.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.EQ, x) +} +func (w whereHelpertime_Time) NEQ(x time.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.NEQ, x) +} +func (w whereHelpertime_Time) LT(x time.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LT, x) +} +func (w whereHelpertime_Time) LTE(x time.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LTE, x) +} +func (w whereHelpertime_Time) GT(x time.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GT, x) +} +func (w whereHelpertime_Time) GTE(x time.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GTE, x) +} + +type whereHelpernull_Time struct{ field string } + +func (w whereHelpernull_Time) EQ(x null.Time) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, false, x) +} +func (w whereHelpernull_Time) NEQ(x null.Time) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, true, x) +} +func (w whereHelpernull_Time) LT(x null.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LT, x) +} +func (w whereHelpernull_Time) LTE(x null.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LTE, x) +} +func (w whereHelpernull_Time) GT(x null.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GT, x) +} +func (w whereHelpernull_Time) GTE(x null.Time) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GTE, x) +} + +func (w whereHelpernull_Time) IsNull() qm.QueryMod { return qmhelper.WhereIsNull(w.field) } +func (w whereHelpernull_Time) IsNotNull() qm.QueryMod { return qmhelper.WhereIsNotNull(w.field) } + +var FollowListWhere = struct { + Follower whereHelperstring + Following whereHelperstring + CreatedAt whereHelpertime_Time + UpdatedAt whereHelpertime_Time + DeletedAt whereHelpernull_Time +}{ + Follower: whereHelperstring{field: "\"follow_list\".\"follower\""}, + Following: whereHelperstring{field: "\"follow_list\".\"following\""}, + CreatedAt: whereHelpertime_Time{field: "\"follow_list\".\"created_at\""}, + UpdatedAt: whereHelpertime_Time{field: "\"follow_list\".\"updated_at\""}, + DeletedAt: whereHelpernull_Time{field: "\"follow_list\".\"deleted_at\""}, +} + +// FollowListRels is where relationship names are stored. +var FollowListRels = struct { + FollowerUsersMetadatum string + FollowingUsersMetadatum string +}{ + FollowerUsersMetadatum: "FollowerUsersMetadatum", + FollowingUsersMetadatum: "FollowingUsersMetadatum", +} + +// followListR is where relationships are stored. +type followListR struct { + FollowerUsersMetadatum *UsersMetadatum `boil:"FollowerUsersMetadatum" json:"FollowerUsersMetadatum" toml:"FollowerUsersMetadatum" yaml:"FollowerUsersMetadatum"` + FollowingUsersMetadatum *UsersMetadatum `boil:"FollowingUsersMetadatum" json:"FollowingUsersMetadatum" toml:"FollowingUsersMetadatum" yaml:"FollowingUsersMetadatum"` +} + +// NewStruct creates a new relationship struct +func (*followListR) NewStruct() *followListR { + return &followListR{} +} + +func (r *followListR) GetFollowerUsersMetadatum() *UsersMetadatum { + if r == nil { + return nil + } + return r.FollowerUsersMetadatum +} + +func (r *followListR) GetFollowingUsersMetadatum() *UsersMetadatum { + if r == nil { + return nil + } + return r.FollowingUsersMetadatum +} + +// followListL is where Load methods for each relationship are stored. +type followListL struct{} + +var ( + followListAllColumns = []string{"follower", "following", "created_at", "updated_at", "deleted_at"} + followListColumnsWithoutDefault = []string{"follower", "following"} + followListColumnsWithDefault = []string{"created_at", "updated_at", "deleted_at"} + followListPrimaryKeyColumns = []string{"follower", "following"} + followListGeneratedColumns = []string{} +) + +type ( + // FollowListSlice is an alias for a slice of pointers to FollowList. + // This should almost always be used instead of []FollowList. + FollowListSlice []*FollowList + // FollowListHook is the signature for custom FollowList hook methods + FollowListHook func(context.Context, boil.ContextExecutor, *FollowList) error + + followListQuery struct { + *queries.Query + } +) + +// Cache for insert, update and upsert +var ( + followListType = reflect.TypeOf(&FollowList{}) + followListMapping = queries.MakeStructMapping(followListType) + followListPrimaryKeyMapping, _ = queries.BindMapping(followListType, followListMapping, followListPrimaryKeyColumns) + followListInsertCacheMut sync.RWMutex + followListInsertCache = make(map[string]insertCache) + followListUpdateCacheMut sync.RWMutex + followListUpdateCache = make(map[string]updateCache) + followListUpsertCacheMut sync.RWMutex + followListUpsertCache = make(map[string]insertCache) +) + +var ( + // Force time package dependency for automated UpdatedAt/CreatedAt. + _ = time.Second + // Force qmhelper dependency for where clause generation (which doesn't + // always happen) + _ = qmhelper.Where +) + +var followListAfterSelectMu sync.Mutex +var followListAfterSelectHooks []FollowListHook + +var followListBeforeInsertMu sync.Mutex +var followListBeforeInsertHooks []FollowListHook +var followListAfterInsertMu sync.Mutex +var followListAfterInsertHooks []FollowListHook + +var followListBeforeUpdateMu sync.Mutex +var followListBeforeUpdateHooks []FollowListHook +var followListAfterUpdateMu sync.Mutex +var followListAfterUpdateHooks []FollowListHook + +var followListBeforeDeleteMu sync.Mutex +var followListBeforeDeleteHooks []FollowListHook +var followListAfterDeleteMu sync.Mutex +var followListAfterDeleteHooks []FollowListHook + +var followListBeforeUpsertMu sync.Mutex +var followListBeforeUpsertHooks []FollowListHook +var followListAfterUpsertMu sync.Mutex +var followListAfterUpsertHooks []FollowListHook + +// doAfterSelectHooks executes all "after Select" hooks. +func (o *FollowList) doAfterSelectHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListAfterSelectHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeInsertHooks executes all "before insert" hooks. +func (o *FollowList) doBeforeInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListBeforeInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterInsertHooks executes all "after Insert" hooks. +func (o *FollowList) doAfterInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListAfterInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpdateHooks executes all "before Update" hooks. +func (o *FollowList) doBeforeUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListBeforeUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpdateHooks executes all "after Update" hooks. +func (o *FollowList) doAfterUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListAfterUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeDeleteHooks executes all "before Delete" hooks. +func (o *FollowList) doBeforeDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListBeforeDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterDeleteHooks executes all "after Delete" hooks. +func (o *FollowList) doAfterDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListAfterDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpsertHooks executes all "before Upsert" hooks. +func (o *FollowList) doBeforeUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListBeforeUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpsertHooks executes all "after Upsert" hooks. +func (o *FollowList) doAfterUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range followListAfterUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// AddFollowListHook registers your hook function for all future operations. +func AddFollowListHook(hookPoint boil.HookPoint, followListHook FollowListHook) { + switch hookPoint { + case boil.AfterSelectHook: + followListAfterSelectMu.Lock() + followListAfterSelectHooks = append(followListAfterSelectHooks, followListHook) + followListAfterSelectMu.Unlock() + case boil.BeforeInsertHook: + followListBeforeInsertMu.Lock() + followListBeforeInsertHooks = append(followListBeforeInsertHooks, followListHook) + followListBeforeInsertMu.Unlock() + case boil.AfterInsertHook: + followListAfterInsertMu.Lock() + followListAfterInsertHooks = append(followListAfterInsertHooks, followListHook) + followListAfterInsertMu.Unlock() + case boil.BeforeUpdateHook: + followListBeforeUpdateMu.Lock() + followListBeforeUpdateHooks = append(followListBeforeUpdateHooks, followListHook) + followListBeforeUpdateMu.Unlock() + case boil.AfterUpdateHook: + followListAfterUpdateMu.Lock() + followListAfterUpdateHooks = append(followListAfterUpdateHooks, followListHook) + followListAfterUpdateMu.Unlock() + case boil.BeforeDeleteHook: + followListBeforeDeleteMu.Lock() + followListBeforeDeleteHooks = append(followListBeforeDeleteHooks, followListHook) + followListBeforeDeleteMu.Unlock() + case boil.AfterDeleteHook: + followListAfterDeleteMu.Lock() + followListAfterDeleteHooks = append(followListAfterDeleteHooks, followListHook) + followListAfterDeleteMu.Unlock() + case boil.BeforeUpsertHook: + followListBeforeUpsertMu.Lock() + followListBeforeUpsertHooks = append(followListBeforeUpsertHooks, followListHook) + followListBeforeUpsertMu.Unlock() + case boil.AfterUpsertHook: + followListAfterUpsertMu.Lock() + followListAfterUpsertHooks = append(followListAfterUpsertHooks, followListHook) + followListAfterUpsertMu.Unlock() + } +} + +// OneG returns a single followList record from the query using the global executor. +func (q followListQuery) OneG(ctx context.Context) (*FollowList, error) { + return q.One(ctx, boil.GetContextDB()) +} + +// One returns a single followList record from the query. +func (q followListQuery) One(ctx context.Context, exec boil.ContextExecutor) (*FollowList, error) { + o := &FollowList{} + + queries.SetLimit(q.Query, 1) + + err := q.Bind(ctx, exec, o) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: failed to execute a one query for follow_list") + } + + if err := o.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + + return o, nil +} + +// AllG returns all FollowList records from the query using the global executor. +func (q followListQuery) AllG(ctx context.Context) (FollowListSlice, error) { + return q.All(ctx, boil.GetContextDB()) +} + +// All returns all FollowList records from the query. +func (q followListQuery) All(ctx context.Context, exec boil.ContextExecutor) (FollowListSlice, error) { + var o []*FollowList + + err := q.Bind(ctx, exec, &o) + if err != nil { + return nil, errors.Wrap(err, "models: failed to assign all query results to FollowList slice") + } + + if len(followListAfterSelectHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + } + } + + return o, nil +} + +// CountG returns the count of all FollowList records in the query using the global executor +func (q followListQuery) CountG(ctx context.Context) (int64, error) { + return q.Count(ctx, boil.GetContextDB()) +} + +// Count returns the count of all FollowList records in the query. +func (q followListQuery) Count(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return 0, errors.Wrap(err, "models: failed to count follow_list rows") + } + + return count, nil +} + +// ExistsG checks if the row exists in the table using the global executor. +func (q followListQuery) ExistsG(ctx context.Context) (bool, error) { + return q.Exists(ctx, boil.GetContextDB()) +} + +// Exists checks if the row exists in the table. +func (q followListQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + queries.SetLimit(q.Query, 1) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return false, errors.Wrap(err, "models: failed to check if follow_list exists") + } + + return count > 0, nil +} + +// FollowerUsersMetadatum pointed to by the foreign key. +func (o *FollowList) FollowerUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { + queryMods := []qm.QueryMod{ + qm.Where("\"pub_key\" = ?", o.Follower), + } + + queryMods = append(queryMods, mods...) + + return UsersMetadata(queryMods...) +} + +// FollowingUsersMetadatum pointed to by the foreign key. +func (o *FollowList) FollowingUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { + queryMods := []qm.QueryMod{ + qm.Where("\"pub_key\" = ?", o.Following), + } + + queryMods = append(queryMods, mods...) + + return UsersMetadata(queryMods...) +} + +// LoadFollowerUsersMetadatum allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for an N-1 relationship. +func (followListL) LoadFollowerUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeFollowList interface{}, mods queries.Applicator) error { + var slice []*FollowList + var object *FollowList + + if singular { + var ok bool + object, ok = maybeFollowList.(*FollowList) + if !ok { + object = new(FollowList) + ok = queries.SetFromEmbeddedStruct(&object, &maybeFollowList) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeFollowList)) + } + } + } else { + s, ok := maybeFollowList.(*[]*FollowList) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeFollowList) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeFollowList)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &followListR{} + } + args[object.Follower] = struct{}{} + + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &followListR{} + } + + args[obj.Follower] = struct{}{} + + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`users_metadata`), + qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load UsersMetadatum") + } + + var resultSlice []*UsersMetadatum + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results of eager load for users_metadata") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") + } + + if len(usersMetadatumAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + + if len(resultSlice) == 0 { + return nil + } + + if singular { + foreign := resultSlice[0] + object.R.FollowerUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.FollowerFollowLists = append(foreign.R.FollowerFollowLists, object) + return nil + } + + for _, local := range slice { + for _, foreign := range resultSlice { + if local.Follower == foreign.PubKey { + local.R.FollowerUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.FollowerFollowLists = append(foreign.R.FollowerFollowLists, local) + break + } + } + } + + return nil +} + +// LoadFollowingUsersMetadatum allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for an N-1 relationship. +func (followListL) LoadFollowingUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeFollowList interface{}, mods queries.Applicator) error { + var slice []*FollowList + var object *FollowList + + if singular { + var ok bool + object, ok = maybeFollowList.(*FollowList) + if !ok { + object = new(FollowList) + ok = queries.SetFromEmbeddedStruct(&object, &maybeFollowList) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeFollowList)) + } + } + } else { + s, ok := maybeFollowList.(*[]*FollowList) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeFollowList) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeFollowList)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &followListR{} + } + args[object.Following] = struct{}{} + + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &followListR{} + } + + args[obj.Following] = struct{}{} + + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`users_metadata`), + qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load UsersMetadatum") + } + + var resultSlice []*UsersMetadatum + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results of eager load for users_metadata") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") + } + + if len(usersMetadatumAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + + if len(resultSlice) == 0 { + return nil + } + + if singular { + foreign := resultSlice[0] + object.R.FollowingUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.FollowingFollowLists = append(foreign.R.FollowingFollowLists, object) + return nil + } + + for _, local := range slice { + for _, foreign := range resultSlice { + if local.Following == foreign.PubKey { + local.R.FollowingUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.FollowingFollowLists = append(foreign.R.FollowingFollowLists, local) + break + } + } + } + + return nil +} + +// SetFollowerUsersMetadatumG of the followList to the related item. +// Sets o.R.FollowerUsersMetadatum to related. +// Adds o to related.R.FollowerFollowLists. +// Uses the global database handle. +func (o *FollowList) SetFollowerUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { + return o.SetFollowerUsersMetadatum(ctx, boil.GetContextDB(), insert, related) +} + +// SetFollowerUsersMetadatum of the followList to the related item. +// Sets o.R.FollowerUsersMetadatum to related. +// Adds o to related.R.FollowerFollowLists. +func (o *FollowList) SetFollowerUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { + var err error + if insert { + if err = related.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } + + updateQuery := fmt.Sprintf( + "UPDATE \"follow_list\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"follower"}), + strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), + ) + values := []interface{}{related.PubKey, o.Follower, o.Following} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + o.Follower = related.PubKey + if o.R == nil { + o.R = &followListR{ + FollowerUsersMetadatum: related, + } + } else { + o.R.FollowerUsersMetadatum = related + } + + if related.R == nil { + related.R = &usersMetadatumR{ + FollowerFollowLists: FollowListSlice{o}, + } + } else { + related.R.FollowerFollowLists = append(related.R.FollowerFollowLists, o) + } + + return nil +} + +// SetFollowingUsersMetadatumG of the followList to the related item. +// Sets o.R.FollowingUsersMetadatum to related. +// Adds o to related.R.FollowingFollowLists. +// Uses the global database handle. +func (o *FollowList) SetFollowingUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { + return o.SetFollowingUsersMetadatum(ctx, boil.GetContextDB(), insert, related) +} + +// SetFollowingUsersMetadatum of the followList to the related item. +// Sets o.R.FollowingUsersMetadatum to related. +// Adds o to related.R.FollowingFollowLists. +func (o *FollowList) SetFollowingUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { + var err error + if insert { + if err = related.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } + + updateQuery := fmt.Sprintf( + "UPDATE \"follow_list\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"following"}), + strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), + ) + values := []interface{}{related.PubKey, o.Follower, o.Following} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + o.Following = related.PubKey + if o.R == nil { + o.R = &followListR{ + FollowingUsersMetadatum: related, + } + } else { + o.R.FollowingUsersMetadatum = related + } + + if related.R == nil { + related.R = &usersMetadatumR{ + FollowingFollowLists: FollowListSlice{o}, + } + } else { + related.R.FollowingFollowLists = append(related.R.FollowingFollowLists, o) + } + + return nil +} + +// FollowLists retrieves all the records using an executor. +func FollowLists(mods ...qm.QueryMod) followListQuery { + mods = append(mods, qm.From("\"follow_list\"")) + q := NewQuery(mods...) + if len(queries.GetSelect(q)) == 0 { + queries.SetSelect(q, []string{"\"follow_list\".*"}) + } + + return followListQuery{q} +} + +// FindFollowListG retrieves a single record by ID. +func FindFollowListG(ctx context.Context, follower string, following string, selectCols ...string) (*FollowList, error) { + return FindFollowList(ctx, boil.GetContextDB(), follower, following, selectCols...) +} + +// FindFollowList retrieves a single record by ID with an executor. +// If selectCols is empty Find will return all columns. +func FindFollowList(ctx context.Context, exec boil.ContextExecutor, follower string, following string, selectCols ...string) (*FollowList, error) { + followListObj := &FollowList{} + + sel := "*" + if len(selectCols) > 0 { + sel = strings.Join(strmangle.IdentQuoteSlice(dialect.LQ, dialect.RQ, selectCols), ",") + } + query := fmt.Sprintf( + "select %s from \"follow_list\" where \"follower\"=$1 AND \"following\"=$2", sel, + ) + + q := queries.Raw(query, follower, following) + + err := q.Bind(ctx, exec, followListObj) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: unable to select from follow_list") + } + + if err = followListObj.doAfterSelectHooks(ctx, exec); err != nil { + return followListObj, err + } + + return followListObj, nil +} + +// InsertG a single record. See Insert for whitelist behavior description. +func (o *FollowList) InsertG(ctx context.Context, columns boil.Columns) error { + return o.Insert(ctx, boil.GetContextDB(), columns) +} + +// Insert a single record using an executor. +// See boil.Columns.InsertColumnSet documentation to understand column list inference for inserts. +func (o *FollowList) Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error { + if o == nil { + return errors.New("models: no follow_list provided for insertion") + } + + var err error + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + if o.UpdatedAt.IsZero() { + o.UpdatedAt = currTime + } + } + + if err := o.doBeforeInsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(followListColumnsWithDefault, o) + + key := makeCacheKey(columns, nzDefaults) + followListInsertCacheMut.RLock() + cache, cached := followListInsertCache[key] + followListInsertCacheMut.RUnlock() + + if !cached { + wl, returnColumns := columns.InsertColumnSet( + followListAllColumns, + followListColumnsWithDefault, + followListColumnsWithoutDefault, + nzDefaults, + ) + + cache.valueMapping, err = queries.BindMapping(followListType, followListMapping, wl) + if err != nil { + return err + } + cache.retMapping, err = queries.BindMapping(followListType, followListMapping, returnColumns) + if err != nil { + return err + } + if len(wl) != 0 { + cache.query = fmt.Sprintf("INSERT INTO \"follow_list\" (\"%s\") %%sVALUES (%s)%%s", strings.Join(wl, "\",\""), strmangle.Placeholders(dialect.UseIndexPlaceholders, len(wl), 1, 1)) + } else { + cache.query = "INSERT INTO \"follow_list\" %sDEFAULT VALUES%s" + } + + var queryOutput, queryReturning string + + if len(cache.retMapping) != 0 { + queryReturning = fmt.Sprintf(" RETURNING \"%s\"", strings.Join(returnColumns, "\",\"")) + } + + cache.query = fmt.Sprintf(cache.query, queryOutput, queryReturning) + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(queries.PtrsFromMapping(value, cache.retMapping)...) + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + + if err != nil { + return errors.Wrap(err, "models: unable to insert into follow_list") + } + + if !cached { + followListInsertCacheMut.Lock() + followListInsertCache[key] = cache + followListInsertCacheMut.Unlock() + } + + return o.doAfterInsertHooks(ctx, exec) +} + +// UpdateG a single FollowList record using the global executor. +// See Update for more documentation. +func (o *FollowList) UpdateG(ctx context.Context, columns boil.Columns) (int64, error) { + return o.Update(ctx, boil.GetContextDB(), columns) +} + +// Update uses an executor to update the FollowList. +// See boil.Columns.UpdateColumnSet documentation to understand column list inference for updates. +// Update does not automatically update the record in case of default values. Use .Reload() to refresh the records. +func (o *FollowList) Update(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) (int64, error) { + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + o.UpdatedAt = currTime + } + + var err error + if err = o.doBeforeUpdateHooks(ctx, exec); err != nil { + return 0, err + } + key := makeCacheKey(columns, nil) + followListUpdateCacheMut.RLock() + cache, cached := followListUpdateCache[key] + followListUpdateCacheMut.RUnlock() + + if !cached { + wl := columns.UpdateColumnSet( + followListAllColumns, + followListPrimaryKeyColumns, + ) + + if !columns.IsWhitelist() { + wl = strmangle.SetComplement(wl, []string{"created_at"}) + } + if len(wl) == 0 { + return 0, errors.New("models: unable to update follow_list, could not build whitelist") + } + + cache.query = fmt.Sprintf("UPDATE \"follow_list\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, wl), + strmangle.WhereClause("\"", "\"", len(wl)+1, followListPrimaryKeyColumns), + ) + cache.valueMapping, err = queries.BindMapping(followListType, followListMapping, append(wl, followListPrimaryKeyColumns...)) + if err != nil { + return 0, err + } + } + + values := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, values) + } + var result sql.Result + result, err = exec.ExecContext(ctx, cache.query, values...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update follow_list row") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by update for follow_list") + } + + if !cached { + followListUpdateCacheMut.Lock() + followListUpdateCache[key] = cache + followListUpdateCacheMut.Unlock() + } + + return rowsAff, o.doAfterUpdateHooks(ctx, exec) +} + +// UpdateAllG updates all rows with the specified column values. +func (q followListQuery) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return q.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values. +func (q followListQuery) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + queries.SetUpdate(q.Query, cols) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all for follow_list") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected for follow_list") + } + + return rowsAff, nil +} + +// UpdateAllG updates all rows with the specified column values. +func (o FollowListSlice) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return o.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values, using an executor. +func (o FollowListSlice) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + ln := int64(len(o)) + if ln == 0 { + return 0, nil + } + + if len(cols) == 0 { + return 0, errors.New("models: update all requires at least one column argument") + } + + colNames := make([]string, len(cols)) + args := make([]interface{}, len(cols)) + + i := 0 + for name, value := range cols { + colNames[i] = name + args[i] = value + i++ + } + + // Append all of the primary key values for each column + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), followListPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := fmt.Sprintf("UPDATE \"follow_list\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, colNames), + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), len(colNames)+1, followListPrimaryKeyColumns, len(o))) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all in followList slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected all in update all followList") + } + return rowsAff, nil +} + +// UpsertG attempts an insert, and does an update or ignore on conflict. +func (o *FollowList) UpsertG(ctx context.Context, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + return o.Upsert(ctx, boil.GetContextDB(), updateOnConflict, conflictColumns, updateColumns, insertColumns, opts...) +} + +// Upsert attempts an insert using an executor, and does an update or ignore on conflict. +// See boil.Columns documentation for how to properly use updateColumns and insertColumns. +func (o *FollowList) Upsert(ctx context.Context, exec boil.ContextExecutor, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + if o == nil { + return errors.New("models: no follow_list provided for upsert") + } + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + o.UpdatedAt = currTime + } + + if err := o.doBeforeUpsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(followListColumnsWithDefault, o) + + // Build cache key in-line uglily - mysql vs psql problems + buf := strmangle.GetBuffer() + if updateOnConflict { + buf.WriteByte('t') + } else { + buf.WriteByte('f') + } + buf.WriteByte('.') + for _, c := range conflictColumns { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(updateColumns.Kind)) + for _, c := range updateColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(insertColumns.Kind)) + for _, c := range insertColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + for _, c := range nzDefaults { + buf.WriteString(c) + } + key := buf.String() + strmangle.PutBuffer(buf) + + followListUpsertCacheMut.RLock() + cache, cached := followListUpsertCache[key] + followListUpsertCacheMut.RUnlock() + + var err error + + if !cached { + insert, _ := insertColumns.InsertColumnSet( + followListAllColumns, + followListColumnsWithDefault, + followListColumnsWithoutDefault, + nzDefaults, + ) + + update := updateColumns.UpdateColumnSet( + followListAllColumns, + followListPrimaryKeyColumns, + ) + + if updateOnConflict && len(update) == 0 { + return errors.New("models: unable to upsert follow_list, could not build update column list") + } + + ret := strmangle.SetComplement(followListAllColumns, strmangle.SetIntersect(insert, update)) + + conflict := conflictColumns + if len(conflict) == 0 && updateOnConflict && len(update) != 0 { + if len(followListPrimaryKeyColumns) == 0 { + return errors.New("models: unable to upsert follow_list, could not build conflict column list") + } + + conflict = make([]string, len(followListPrimaryKeyColumns)) + copy(conflict, followListPrimaryKeyColumns) + } + cache.query = buildUpsertQueryPostgres(dialect, "\"follow_list\"", updateOnConflict, ret, update, conflict, insert, opts...) + + cache.valueMapping, err = queries.BindMapping(followListType, followListMapping, insert) + if err != nil { + return err + } + if len(ret) != 0 { + cache.retMapping, err = queries.BindMapping(followListType, followListMapping, ret) + if err != nil { + return err + } + } + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + var returns []interface{} + if len(cache.retMapping) != 0 { + returns = queries.PtrsFromMapping(value, cache.retMapping) + } + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(returns...) + if errors.Is(err, sql.ErrNoRows) { + err = nil // Postgres doesn't return anything when there's no update + } + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + if err != nil { + return errors.Wrap(err, "models: unable to upsert follow_list") + } + + if !cached { + followListUpsertCacheMut.Lock() + followListUpsertCache[key] = cache + followListUpsertCacheMut.Unlock() + } + + return o.doAfterUpsertHooks(ctx, exec) +} + +// DeleteG deletes a single FollowList record. +// DeleteG will match against the primary key column to find the record to delete. +func (o *FollowList) DeleteG(ctx context.Context) (int64, error) { + return o.Delete(ctx, boil.GetContextDB()) +} + +// Delete deletes a single FollowList record with an executor. +// Delete will match against the primary key column to find the record to delete. +func (o *FollowList) Delete(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if o == nil { + return 0, errors.New("models: no FollowList provided for delete") + } + + if err := o.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + args := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), followListPrimaryKeyMapping) + sql := "DELETE FROM \"follow_list\" WHERE \"follower\"=$1 AND \"following\"=$2" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete from follow_list") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by delete for follow_list") + } + + if err := o.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + return rowsAff, nil +} + +func (q followListQuery) DeleteAllG(ctx context.Context) (int64, error) { + return q.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all matching rows. +func (q followListQuery) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if q.Query == nil { + return 0, errors.New("models: no followListQuery provided for delete all") + } + + queries.SetDelete(q.Query) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from follow_list") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for follow_list") + } + + return rowsAff, nil +} + +// DeleteAllG deletes all rows in the slice. +func (o FollowListSlice) DeleteAllG(ctx context.Context) (int64, error) { + return o.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all rows in the slice, using an executor. +func (o FollowListSlice) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if len(o) == 0 { + return 0, nil + } + + if len(followListBeforeDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + var args []interface{} + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), followListPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "DELETE FROM \"follow_list\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, followListPrimaryKeyColumns, len(o)) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from followList slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for follow_list") + } + + if len(followListAfterDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + return rowsAff, nil +} + +// ReloadG refetches the object from the database using the primary keys. +func (o *FollowList) ReloadG(ctx context.Context) error { + if o == nil { + return errors.New("models: no FollowList provided for reload") + } + + return o.Reload(ctx, boil.GetContextDB()) +} + +// Reload refetches the object from the database +// using the primary keys with an executor. +func (o *FollowList) Reload(ctx context.Context, exec boil.ContextExecutor) error { + ret, err := FindFollowList(ctx, exec, o.Follower, o.Following) + if err != nil { + return err + } + + *o = *ret + return nil +} + +// ReloadAllG refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *FollowListSlice) ReloadAllG(ctx context.Context) error { + if o == nil { + return errors.New("models: empty FollowListSlice provided for reload all") + } + + return o.ReloadAll(ctx, boil.GetContextDB()) +} + +// ReloadAll refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *FollowListSlice) ReloadAll(ctx context.Context, exec boil.ContextExecutor) error { + if o == nil || len(*o) == 0 { + return nil + } + + slice := FollowListSlice{} + var args []interface{} + for _, obj := range *o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), followListPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "SELECT \"follow_list\".* FROM \"follow_list\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, followListPrimaryKeyColumns, len(*o)) + + q := queries.Raw(sql, args...) + + err := q.Bind(ctx, exec, &slice) + if err != nil { + return errors.Wrap(err, "models: unable to reload all in FollowListSlice") + } + + *o = slice + + return nil +} + +// FollowListExistsG checks if the FollowList row exists. +func FollowListExistsG(ctx context.Context, follower string, following string) (bool, error) { + return FollowListExists(ctx, boil.GetContextDB(), follower, following) +} + +// FollowListExists checks if the FollowList row exists. +func FollowListExists(ctx context.Context, exec boil.ContextExecutor, follower string, following string) (bool, error) { + var exists bool + sql := "select exists(select 1 from \"follow_list\" where \"follower\"=$1 AND \"following\"=$2 limit 1)" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, follower, following) + } + row := exec.QueryRowContext(ctx, sql, follower, following) + + err := row.Scan(&exists) + if err != nil { + return false, errors.Wrap(err, "models: unable to check if follow_list exists") + } + + return exists, nil +} + +// Exists checks if the FollowList row exists. +func (o *FollowList) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + return FollowListExists(ctx, exec, o.Follower, o.Following) +} diff --git a/models/psql_upsert.go b/models/psql_upsert.go new file mode 100644 index 0000000..07602da --- /dev/null +++ b/models/psql_upsert.go @@ -0,0 +1,99 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "fmt" + "strings" + + "github.com/volatiletech/sqlboiler/v4/drivers" + "github.com/volatiletech/strmangle" +) + +type UpsertOptions struct { + conflictTarget string + updateSet string +} + +type UpsertOptionFunc func(o *UpsertOptions) + +func UpsertConflictTarget(conflictTarget string) UpsertOptionFunc { + return func(o *UpsertOptions) { + o.conflictTarget = conflictTarget + } +} + +func UpsertUpdateSet(updateSet string) UpsertOptionFunc { + return func(o *UpsertOptions) { + o.updateSet = updateSet + } +} + +// buildUpsertQueryPostgres builds a SQL statement string using the upsertData provided. +func buildUpsertQueryPostgres(dia drivers.Dialect, tableName string, updateOnConflict bool, ret, update, conflict, whitelist []string, opts ...UpsertOptionFunc) string { + conflict = strmangle.IdentQuoteSlice(dia.LQ, dia.RQ, conflict) + whitelist = strmangle.IdentQuoteSlice(dia.LQ, dia.RQ, whitelist) + ret = strmangle.IdentQuoteSlice(dia.LQ, dia.RQ, ret) + + upsertOpts := &UpsertOptions{} + for _, o := range opts { + o(upsertOpts) + } + + buf := strmangle.GetBuffer() + defer strmangle.PutBuffer(buf) + + columns := "DEFAULT VALUES" + if len(whitelist) != 0 { + columns = fmt.Sprintf("(%s) VALUES (%s)", + strings.Join(whitelist, ", "), + strmangle.Placeholders(dia.UseIndexPlaceholders, len(whitelist), 1, 1)) + } + + fmt.Fprintf( + buf, + "INSERT INTO %s %s ON CONFLICT ", + tableName, + columns, + ) + + if upsertOpts.conflictTarget != "" { + buf.WriteString(upsertOpts.conflictTarget) + } else if len(conflict) != 0 { + buf.WriteByte('(') + buf.WriteString(strings.Join(conflict, ", ")) + buf.WriteByte(')') + } + buf.WriteByte(' ') + + if !updateOnConflict || len(update) == 0 { + buf.WriteString("DO NOTHING") + } else { + buf.WriteString("DO UPDATE SET ") + + if upsertOpts.updateSet != "" { + buf.WriteString(upsertOpts.updateSet) + } else { + for i, v := range update { + if len(v) == 0 { + continue + } + if i != 0 { + buf.WriteByte(',') + } + quoted := strmangle.IdentQuote(dia.LQ, dia.RQ, v) + buf.WriteString(quoted) + buf.WriteString(" = EXCLUDED.") + buf.WriteString(quoted) + } + } + } + + if len(ret) != 0 { + buf.WriteString(" RETURNING ") + buf.WriteString(strings.Join(ret, ", ")) + } + + return buf.String() +} diff --git a/models/reactions.go b/models/reactions.go new file mode 100644 index 0000000..93b80b7 --- /dev/null +++ b/models/reactions.go @@ -0,0 +1,1687 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "context" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/friendsofgo/errors" + "github.com/volatiletech/null/v8" + "github.com/volatiletech/sqlboiler/v4/boil" + "github.com/volatiletech/sqlboiler/v4/queries" + "github.com/volatiletech/sqlboiler/v4/queries/qm" + "github.com/volatiletech/sqlboiler/v4/queries/qmhelper" + "github.com/volatiletech/sqlboiler/v4/types" + "github.com/volatiletech/strmangle" +) + +// Reaction is an object representing the database table. +type Reaction struct { + ID string `boil:"id" json:"id" toml:"id" yaml:"id"` + TextNotesid null.String `boil:"text_notesid" json:"text_notesid,omitempty" toml:"text_notesid" yaml:"text_notesid,omitempty"` + UsersMetadatapubKey null.String `boil:"users_metadatapub_key" json:"users_metadatapub_key,omitempty" toml:"users_metadatapub_key" yaml:"users_metadatapub_key,omitempty"` + E types.StringArray `boil:"e" json:"e,omitempty" toml:"e" yaml:"e,omitempty"` + P types.StringArray `boil:"p" json:"p,omitempty" toml:"p" yaml:"p,omitempty"` + A types.StringArray `boil:"a" json:"a,omitempty" toml:"a" yaml:"a,omitempty"` + Event types.JSON `boil:"event" json:"event" toml:"event" yaml:"event"` + K types.StringArray `boil:"k" json:"k,omitempty" toml:"k" yaml:"k,omitempty"` + CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"` + UpdatedAt time.Time `boil:"updated_at" json:"updated_at" toml:"updated_at" yaml:"updated_at"` + DeletedAt null.Time `boil:"deleted_at" json:"deleted_at,omitempty" toml:"deleted_at" yaml:"deleted_at,omitempty"` + + R *reactionR `boil:"-" json:"-" toml:"-" yaml:"-"` + L reactionL `boil:"-" json:"-" toml:"-" yaml:"-"` +} + +var ReactionColumns = struct { + ID string + TextNotesid string + UsersMetadatapubKey string + E string + P string + A string + Event string + K string + CreatedAt string + UpdatedAt string + DeletedAt string +}{ + ID: "id", + TextNotesid: "text_notesid", + UsersMetadatapubKey: "users_metadatapub_key", + E: "e", + P: "p", + A: "a", + Event: "event", + K: "k", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +var ReactionTableColumns = struct { + ID string + TextNotesid string + UsersMetadatapubKey string + E string + P string + A string + Event string + K string + CreatedAt string + UpdatedAt string + DeletedAt string +}{ + ID: "reactions.id", + TextNotesid: "reactions.text_notesid", + UsersMetadatapubKey: "reactions.users_metadatapub_key", + E: "reactions.e", + P: "reactions.p", + A: "reactions.a", + Event: "reactions.event", + K: "reactions.k", + CreatedAt: "reactions.created_at", + UpdatedAt: "reactions.updated_at", + DeletedAt: "reactions.deleted_at", +} + +// Generated where + +type whereHelpernull_String struct{ field string } + +func (w whereHelpernull_String) EQ(x null.String) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, false, x) +} +func (w whereHelpernull_String) NEQ(x null.String) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, true, x) +} +func (w whereHelpernull_String) LT(x null.String) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LT, x) +} +func (w whereHelpernull_String) LTE(x null.String) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LTE, x) +} +func (w whereHelpernull_String) GT(x null.String) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GT, x) +} +func (w whereHelpernull_String) GTE(x null.String) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GTE, x) +} +func (w whereHelpernull_String) LIKE(x null.String) qm.QueryMod { + return qm.Where(w.field+" LIKE ?", x) +} +func (w whereHelpernull_String) NLIKE(x null.String) qm.QueryMod { + return qm.Where(w.field+" NOT LIKE ?", x) +} +func (w whereHelpernull_String) ILIKE(x null.String) qm.QueryMod { + return qm.Where(w.field+" ILIKE ?", x) +} +func (w whereHelpernull_String) NILIKE(x null.String) qm.QueryMod { + return qm.Where(w.field+" NOT ILIKE ?", x) +} +func (w whereHelpernull_String) IN(slice []string) qm.QueryMod { + values := make([]interface{}, 0, len(slice)) + for _, value := range slice { + values = append(values, value) + } + return qm.WhereIn(fmt.Sprintf("%s IN ?", w.field), values...) +} +func (w whereHelpernull_String) NIN(slice []string) qm.QueryMod { + values := make([]interface{}, 0, len(slice)) + for _, value := range slice { + values = append(values, value) + } + return qm.WhereNotIn(fmt.Sprintf("%s NOT IN ?", w.field), values...) +} + +func (w whereHelpernull_String) IsNull() qm.QueryMod { return qmhelper.WhereIsNull(w.field) } +func (w whereHelpernull_String) IsNotNull() qm.QueryMod { return qmhelper.WhereIsNotNull(w.field) } + +type whereHelpertypes_StringArray struct{ field string } + +func (w whereHelpertypes_StringArray) EQ(x types.StringArray) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, false, x) +} +func (w whereHelpertypes_StringArray) NEQ(x types.StringArray) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, true, x) +} +func (w whereHelpertypes_StringArray) LT(x types.StringArray) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LT, x) +} +func (w whereHelpertypes_StringArray) LTE(x types.StringArray) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LTE, x) +} +func (w whereHelpertypes_StringArray) GT(x types.StringArray) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GT, x) +} +func (w whereHelpertypes_StringArray) GTE(x types.StringArray) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GTE, x) +} + +func (w whereHelpertypes_StringArray) IsNull() qm.QueryMod { return qmhelper.WhereIsNull(w.field) } +func (w whereHelpertypes_StringArray) IsNotNull() qm.QueryMod { + return qmhelper.WhereIsNotNull(w.field) +} + +type whereHelpertypes_JSON struct{ field string } + +func (w whereHelpertypes_JSON) EQ(x types.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.EQ, x) +} +func (w whereHelpertypes_JSON) NEQ(x types.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.NEQ, x) +} +func (w whereHelpertypes_JSON) LT(x types.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LT, x) +} +func (w whereHelpertypes_JSON) LTE(x types.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LTE, x) +} +func (w whereHelpertypes_JSON) GT(x types.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GT, x) +} +func (w whereHelpertypes_JSON) GTE(x types.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GTE, x) +} + +var ReactionWhere = struct { + ID whereHelperstring + TextNotesid whereHelpernull_String + UsersMetadatapubKey whereHelpernull_String + E whereHelpertypes_StringArray + P whereHelpertypes_StringArray + A whereHelpertypes_StringArray + Event whereHelpertypes_JSON + K whereHelpertypes_StringArray + CreatedAt whereHelpertime_Time + UpdatedAt whereHelpertime_Time + DeletedAt whereHelpernull_Time +}{ + ID: whereHelperstring{field: "\"reactions\".\"id\""}, + TextNotesid: whereHelpernull_String{field: "\"reactions\".\"text_notesid\""}, + UsersMetadatapubKey: whereHelpernull_String{field: "\"reactions\".\"users_metadatapub_key\""}, + E: whereHelpertypes_StringArray{field: "\"reactions\".\"e\""}, + P: whereHelpertypes_StringArray{field: "\"reactions\".\"p\""}, + A: whereHelpertypes_StringArray{field: "\"reactions\".\"a\""}, + Event: whereHelpertypes_JSON{field: "\"reactions\".\"event\""}, + K: whereHelpertypes_StringArray{field: "\"reactions\".\"k\""}, + CreatedAt: whereHelpertime_Time{field: "\"reactions\".\"created_at\""}, + UpdatedAt: whereHelpertime_Time{field: "\"reactions\".\"updated_at\""}, + DeletedAt: whereHelpernull_Time{field: "\"reactions\".\"deleted_at\""}, +} + +// ReactionRels is where relationship names are stored. +var ReactionRels = struct { + TextNotesidTextNote string + UsersMetadatapubKeyUsersMetadatum string +}{ + TextNotesidTextNote: "TextNotesidTextNote", + UsersMetadatapubKeyUsersMetadatum: "UsersMetadatapubKeyUsersMetadatum", +} + +// reactionR is where relationships are stored. +type reactionR struct { + TextNotesidTextNote *TextNote `boil:"TextNotesidTextNote" json:"TextNotesidTextNote" toml:"TextNotesidTextNote" yaml:"TextNotesidTextNote"` + UsersMetadatapubKeyUsersMetadatum *UsersMetadatum `boil:"UsersMetadatapubKeyUsersMetadatum" json:"UsersMetadatapubKeyUsersMetadatum" toml:"UsersMetadatapubKeyUsersMetadatum" yaml:"UsersMetadatapubKeyUsersMetadatum"` +} + +// NewStruct creates a new relationship struct +func (*reactionR) NewStruct() *reactionR { + return &reactionR{} +} + +func (r *reactionR) GetTextNotesidTextNote() *TextNote { + if r == nil { + return nil + } + return r.TextNotesidTextNote +} + +func (r *reactionR) GetUsersMetadatapubKeyUsersMetadatum() *UsersMetadatum { + if r == nil { + return nil + } + return r.UsersMetadatapubKeyUsersMetadatum +} + +// reactionL is where Load methods for each relationship are stored. +type reactionL struct{} + +var ( + reactionAllColumns = []string{"id", "text_notesid", "users_metadatapub_key", "e", "p", "a", "event", "k", "created_at", "updated_at", "deleted_at"} + reactionColumnsWithoutDefault = []string{"id", "event"} + reactionColumnsWithDefault = []string{"text_notesid", "users_metadatapub_key", "e", "p", "a", "k", "created_at", "updated_at", "deleted_at"} + reactionPrimaryKeyColumns = []string{"id"} + reactionGeneratedColumns = []string{} +) + +type ( + // ReactionSlice is an alias for a slice of pointers to Reaction. + // This should almost always be used instead of []Reaction. + ReactionSlice []*Reaction + // ReactionHook is the signature for custom Reaction hook methods + ReactionHook func(context.Context, boil.ContextExecutor, *Reaction) error + + reactionQuery struct { + *queries.Query + } +) + +// Cache for insert, update and upsert +var ( + reactionType = reflect.TypeOf(&Reaction{}) + reactionMapping = queries.MakeStructMapping(reactionType) + reactionPrimaryKeyMapping, _ = queries.BindMapping(reactionType, reactionMapping, reactionPrimaryKeyColumns) + reactionInsertCacheMut sync.RWMutex + reactionInsertCache = make(map[string]insertCache) + reactionUpdateCacheMut sync.RWMutex + reactionUpdateCache = make(map[string]updateCache) + reactionUpsertCacheMut sync.RWMutex + reactionUpsertCache = make(map[string]insertCache) +) + +var ( + // Force time package dependency for automated UpdatedAt/CreatedAt. + _ = time.Second + // Force qmhelper dependency for where clause generation (which doesn't + // always happen) + _ = qmhelper.Where +) + +var reactionAfterSelectMu sync.Mutex +var reactionAfterSelectHooks []ReactionHook + +var reactionBeforeInsertMu sync.Mutex +var reactionBeforeInsertHooks []ReactionHook +var reactionAfterInsertMu sync.Mutex +var reactionAfterInsertHooks []ReactionHook + +var reactionBeforeUpdateMu sync.Mutex +var reactionBeforeUpdateHooks []ReactionHook +var reactionAfterUpdateMu sync.Mutex +var reactionAfterUpdateHooks []ReactionHook + +var reactionBeforeDeleteMu sync.Mutex +var reactionBeforeDeleteHooks []ReactionHook +var reactionAfterDeleteMu sync.Mutex +var reactionAfterDeleteHooks []ReactionHook + +var reactionBeforeUpsertMu sync.Mutex +var reactionBeforeUpsertHooks []ReactionHook +var reactionAfterUpsertMu sync.Mutex +var reactionAfterUpsertHooks []ReactionHook + +// doAfterSelectHooks executes all "after Select" hooks. +func (o *Reaction) doAfterSelectHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionAfterSelectHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeInsertHooks executes all "before insert" hooks. +func (o *Reaction) doBeforeInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionBeforeInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterInsertHooks executes all "after Insert" hooks. +func (o *Reaction) doAfterInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionAfterInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpdateHooks executes all "before Update" hooks. +func (o *Reaction) doBeforeUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionBeforeUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpdateHooks executes all "after Update" hooks. +func (o *Reaction) doAfterUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionAfterUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeDeleteHooks executes all "before Delete" hooks. +func (o *Reaction) doBeforeDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionBeforeDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterDeleteHooks executes all "after Delete" hooks. +func (o *Reaction) doAfterDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionAfterDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpsertHooks executes all "before Upsert" hooks. +func (o *Reaction) doBeforeUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionBeforeUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpsertHooks executes all "after Upsert" hooks. +func (o *Reaction) doAfterUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range reactionAfterUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// AddReactionHook registers your hook function for all future operations. +func AddReactionHook(hookPoint boil.HookPoint, reactionHook ReactionHook) { + switch hookPoint { + case boil.AfterSelectHook: + reactionAfterSelectMu.Lock() + reactionAfterSelectHooks = append(reactionAfterSelectHooks, reactionHook) + reactionAfterSelectMu.Unlock() + case boil.BeforeInsertHook: + reactionBeforeInsertMu.Lock() + reactionBeforeInsertHooks = append(reactionBeforeInsertHooks, reactionHook) + reactionBeforeInsertMu.Unlock() + case boil.AfterInsertHook: + reactionAfterInsertMu.Lock() + reactionAfterInsertHooks = append(reactionAfterInsertHooks, reactionHook) + reactionAfterInsertMu.Unlock() + case boil.BeforeUpdateHook: + reactionBeforeUpdateMu.Lock() + reactionBeforeUpdateHooks = append(reactionBeforeUpdateHooks, reactionHook) + reactionBeforeUpdateMu.Unlock() + case boil.AfterUpdateHook: + reactionAfterUpdateMu.Lock() + reactionAfterUpdateHooks = append(reactionAfterUpdateHooks, reactionHook) + reactionAfterUpdateMu.Unlock() + case boil.BeforeDeleteHook: + reactionBeforeDeleteMu.Lock() + reactionBeforeDeleteHooks = append(reactionBeforeDeleteHooks, reactionHook) + reactionBeforeDeleteMu.Unlock() + case boil.AfterDeleteHook: + reactionAfterDeleteMu.Lock() + reactionAfterDeleteHooks = append(reactionAfterDeleteHooks, reactionHook) + reactionAfterDeleteMu.Unlock() + case boil.BeforeUpsertHook: + reactionBeforeUpsertMu.Lock() + reactionBeforeUpsertHooks = append(reactionBeforeUpsertHooks, reactionHook) + reactionBeforeUpsertMu.Unlock() + case boil.AfterUpsertHook: + reactionAfterUpsertMu.Lock() + reactionAfterUpsertHooks = append(reactionAfterUpsertHooks, reactionHook) + reactionAfterUpsertMu.Unlock() + } +} + +// OneG returns a single reaction record from the query using the global executor. +func (q reactionQuery) OneG(ctx context.Context) (*Reaction, error) { + return q.One(ctx, boil.GetContextDB()) +} + +// One returns a single reaction record from the query. +func (q reactionQuery) One(ctx context.Context, exec boil.ContextExecutor) (*Reaction, error) { + o := &Reaction{} + + queries.SetLimit(q.Query, 1) + + err := q.Bind(ctx, exec, o) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: failed to execute a one query for reactions") + } + + if err := o.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + + return o, nil +} + +// AllG returns all Reaction records from the query using the global executor. +func (q reactionQuery) AllG(ctx context.Context) (ReactionSlice, error) { + return q.All(ctx, boil.GetContextDB()) +} + +// All returns all Reaction records from the query. +func (q reactionQuery) All(ctx context.Context, exec boil.ContextExecutor) (ReactionSlice, error) { + var o []*Reaction + + err := q.Bind(ctx, exec, &o) + if err != nil { + return nil, errors.Wrap(err, "models: failed to assign all query results to Reaction slice") + } + + if len(reactionAfterSelectHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + } + } + + return o, nil +} + +// CountG returns the count of all Reaction records in the query using the global executor +func (q reactionQuery) CountG(ctx context.Context) (int64, error) { + return q.Count(ctx, boil.GetContextDB()) +} + +// Count returns the count of all Reaction records in the query. +func (q reactionQuery) Count(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return 0, errors.Wrap(err, "models: failed to count reactions rows") + } + + return count, nil +} + +// ExistsG checks if the row exists in the table using the global executor. +func (q reactionQuery) ExistsG(ctx context.Context) (bool, error) { + return q.Exists(ctx, boil.GetContextDB()) +} + +// Exists checks if the row exists in the table. +func (q reactionQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + queries.SetLimit(q.Query, 1) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return false, errors.Wrap(err, "models: failed to check if reactions exists") + } + + return count > 0, nil +} + +// TextNotesidTextNote pointed to by the foreign key. +func (o *Reaction) TextNotesidTextNote(mods ...qm.QueryMod) textNoteQuery { + queryMods := []qm.QueryMod{ + qm.Where("\"id\" = ?", o.TextNotesid), + } + + queryMods = append(queryMods, mods...) + + return TextNotes(queryMods...) +} + +// UsersMetadatapubKeyUsersMetadatum pointed to by the foreign key. +func (o *Reaction) UsersMetadatapubKeyUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { + queryMods := []qm.QueryMod{ + qm.Where("\"pub_key\" = ?", o.UsersMetadatapubKey), + } + + queryMods = append(queryMods, mods...) + + return UsersMetadata(queryMods...) +} + +// LoadTextNotesidTextNote allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for an N-1 relationship. +func (reactionL) LoadTextNotesidTextNote(ctx context.Context, e boil.ContextExecutor, singular bool, maybeReaction interface{}, mods queries.Applicator) error { + var slice []*Reaction + var object *Reaction + + if singular { + var ok bool + object, ok = maybeReaction.(*Reaction) + if !ok { + object = new(Reaction) + ok = queries.SetFromEmbeddedStruct(&object, &maybeReaction) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeReaction)) + } + } + } else { + s, ok := maybeReaction.(*[]*Reaction) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeReaction) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeReaction)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &reactionR{} + } + if !queries.IsNil(object.TextNotesid) { + args[object.TextNotesid] = struct{}{} + } + + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &reactionR{} + } + + if !queries.IsNil(obj.TextNotesid) { + args[obj.TextNotesid] = struct{}{} + } + + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`text_notes`), + qm.WhereIn(`text_notes.id in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load TextNote") + } + + var resultSlice []*TextNote + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice TextNote") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results of eager load for text_notes") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for text_notes") + } + + if len(textNoteAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + + if len(resultSlice) == 0 { + return nil + } + + if singular { + foreign := resultSlice[0] + object.R.TextNotesidTextNote = foreign + if foreign.R == nil { + foreign.R = &textNoteR{} + } + foreign.R.TextNotesidReactions = append(foreign.R.TextNotesidReactions, object) + return nil + } + + for _, local := range slice { + for _, foreign := range resultSlice { + if queries.Equal(local.TextNotesid, foreign.ID) { + local.R.TextNotesidTextNote = foreign + if foreign.R == nil { + foreign.R = &textNoteR{} + } + foreign.R.TextNotesidReactions = append(foreign.R.TextNotesidReactions, local) + break + } + } + } + + return nil +} + +// LoadUsersMetadatapubKeyUsersMetadatum allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for an N-1 relationship. +func (reactionL) LoadUsersMetadatapubKeyUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeReaction interface{}, mods queries.Applicator) error { + var slice []*Reaction + var object *Reaction + + if singular { + var ok bool + object, ok = maybeReaction.(*Reaction) + if !ok { + object = new(Reaction) + ok = queries.SetFromEmbeddedStruct(&object, &maybeReaction) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeReaction)) + } + } + } else { + s, ok := maybeReaction.(*[]*Reaction) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeReaction) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeReaction)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &reactionR{} + } + if !queries.IsNil(object.UsersMetadatapubKey) { + args[object.UsersMetadatapubKey] = struct{}{} + } + + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &reactionR{} + } + + if !queries.IsNil(obj.UsersMetadatapubKey) { + args[obj.UsersMetadatapubKey] = struct{}{} + } + + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`users_metadata`), + qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load UsersMetadatum") + } + + var resultSlice []*UsersMetadatum + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results of eager load for users_metadata") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") + } + + if len(usersMetadatumAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + + if len(resultSlice) == 0 { + return nil + } + + if singular { + foreign := resultSlice[0] + object.R.UsersMetadatapubKeyUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.UsersMetadatapubKeyReactions = append(foreign.R.UsersMetadatapubKeyReactions, object) + return nil + } + + for _, local := range slice { + for _, foreign := range resultSlice { + if queries.Equal(local.UsersMetadatapubKey, foreign.PubKey) { + local.R.UsersMetadatapubKeyUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.UsersMetadatapubKeyReactions = append(foreign.R.UsersMetadatapubKeyReactions, local) + break + } + } + } + + return nil +} + +// SetTextNotesidTextNoteG of the reaction to the related item. +// Sets o.R.TextNotesidTextNote to related. +// Adds o to related.R.TextNotesidReactions. +// Uses the global database handle. +func (o *Reaction) SetTextNotesidTextNoteG(ctx context.Context, insert bool, related *TextNote) error { + return o.SetTextNotesidTextNote(ctx, boil.GetContextDB(), insert, related) +} + +// SetTextNotesidTextNote of the reaction to the related item. +// Sets o.R.TextNotesidTextNote to related. +// Adds o to related.R.TextNotesidReactions. +func (o *Reaction) SetTextNotesidTextNote(ctx context.Context, exec boil.ContextExecutor, insert bool, related *TextNote) error { + var err error + if insert { + if err = related.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } + + updateQuery := fmt.Sprintf( + "UPDATE \"reactions\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"text_notesid"}), + strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), + ) + values := []interface{}{related.ID, o.ID} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + queries.Assign(&o.TextNotesid, related.ID) + if o.R == nil { + o.R = &reactionR{ + TextNotesidTextNote: related, + } + } else { + o.R.TextNotesidTextNote = related + } + + if related.R == nil { + related.R = &textNoteR{ + TextNotesidReactions: ReactionSlice{o}, + } + } else { + related.R.TextNotesidReactions = append(related.R.TextNotesidReactions, o) + } + + return nil +} + +// RemoveTextNotesidTextNoteG relationship. +// Sets o.R.TextNotesidTextNote to nil. +// Removes o from all passed in related items' relationships struct. +// Uses the global database handle. +func (o *Reaction) RemoveTextNotesidTextNoteG(ctx context.Context, related *TextNote) error { + return o.RemoveTextNotesidTextNote(ctx, boil.GetContextDB(), related) +} + +// RemoveTextNotesidTextNote relationship. +// Sets o.R.TextNotesidTextNote to nil. +// Removes o from all passed in related items' relationships struct. +func (o *Reaction) RemoveTextNotesidTextNote(ctx context.Context, exec boil.ContextExecutor, related *TextNote) error { + var err error + + queries.SetScanner(&o.TextNotesid, nil) + if _, err = o.Update(ctx, exec, boil.Whitelist("text_notesid")); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + if o.R != nil { + o.R.TextNotesidTextNote = nil + } + if related == nil || related.R == nil { + return nil + } + + for i, ri := range related.R.TextNotesidReactions { + if queries.Equal(o.TextNotesid, ri.TextNotesid) { + continue + } + + ln := len(related.R.TextNotesidReactions) + if ln > 1 && i < ln-1 { + related.R.TextNotesidReactions[i] = related.R.TextNotesidReactions[ln-1] + } + related.R.TextNotesidReactions = related.R.TextNotesidReactions[:ln-1] + break + } + return nil +} + +// SetUsersMetadatapubKeyUsersMetadatumG of the reaction to the related item. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. +// Adds o to related.R.UsersMetadatapubKeyReactions. +// Uses the global database handle. +func (o *Reaction) SetUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { + return o.SetUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), insert, related) +} + +// SetUsersMetadatapubKeyUsersMetadatum of the reaction to the related item. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. +// Adds o to related.R.UsersMetadatapubKeyReactions. +func (o *Reaction) SetUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { + var err error + if insert { + if err = related.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } + + updateQuery := fmt.Sprintf( + "UPDATE \"reactions\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), + strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), + ) + values := []interface{}{related.PubKey, o.ID} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + queries.Assign(&o.UsersMetadatapubKey, related.PubKey) + if o.R == nil { + o.R = &reactionR{ + UsersMetadatapubKeyUsersMetadatum: related, + } + } else { + o.R.UsersMetadatapubKeyUsersMetadatum = related + } + + if related.R == nil { + related.R = &usersMetadatumR{ + UsersMetadatapubKeyReactions: ReactionSlice{o}, + } + } else { + related.R.UsersMetadatapubKeyReactions = append(related.R.UsersMetadatapubKeyReactions, o) + } + + return nil +} + +// RemoveUsersMetadatapubKeyUsersMetadatumG relationship. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. +// Removes o from all passed in related items' relationships struct. +// Uses the global database handle. +func (o *Reaction) RemoveUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, related *UsersMetadatum) error { + return o.RemoveUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), related) +} + +// RemoveUsersMetadatapubKeyUsersMetadatum relationship. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. +// Removes o from all passed in related items' relationships struct. +func (o *Reaction) RemoveUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, related *UsersMetadatum) error { + var err error + + queries.SetScanner(&o.UsersMetadatapubKey, nil) + if _, err = o.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + if o.R != nil { + o.R.UsersMetadatapubKeyUsersMetadatum = nil + } + if related == nil || related.R == nil { + return nil + } + + for i, ri := range related.R.UsersMetadatapubKeyReactions { + if queries.Equal(o.UsersMetadatapubKey, ri.UsersMetadatapubKey) { + continue + } + + ln := len(related.R.UsersMetadatapubKeyReactions) + if ln > 1 && i < ln-1 { + related.R.UsersMetadatapubKeyReactions[i] = related.R.UsersMetadatapubKeyReactions[ln-1] + } + related.R.UsersMetadatapubKeyReactions = related.R.UsersMetadatapubKeyReactions[:ln-1] + break + } + return nil +} + +// Reactions retrieves all the records using an executor. +func Reactions(mods ...qm.QueryMod) reactionQuery { + mods = append(mods, qm.From("\"reactions\"")) + q := NewQuery(mods...) + if len(queries.GetSelect(q)) == 0 { + queries.SetSelect(q, []string{"\"reactions\".*"}) + } + + return reactionQuery{q} +} + +// FindReactionG retrieves a single record by ID. +func FindReactionG(ctx context.Context, iD string, selectCols ...string) (*Reaction, error) { + return FindReaction(ctx, boil.GetContextDB(), iD, selectCols...) +} + +// FindReaction retrieves a single record by ID with an executor. +// If selectCols is empty Find will return all columns. +func FindReaction(ctx context.Context, exec boil.ContextExecutor, iD string, selectCols ...string) (*Reaction, error) { + reactionObj := &Reaction{} + + sel := "*" + if len(selectCols) > 0 { + sel = strings.Join(strmangle.IdentQuoteSlice(dialect.LQ, dialect.RQ, selectCols), ",") + } + query := fmt.Sprintf( + "select %s from \"reactions\" where \"id\"=$1", sel, + ) + + q := queries.Raw(query, iD) + + err := q.Bind(ctx, exec, reactionObj) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: unable to select from reactions") + } + + if err = reactionObj.doAfterSelectHooks(ctx, exec); err != nil { + return reactionObj, err + } + + return reactionObj, nil +} + +// InsertG a single record. See Insert for whitelist behavior description. +func (o *Reaction) InsertG(ctx context.Context, columns boil.Columns) error { + return o.Insert(ctx, boil.GetContextDB(), columns) +} + +// Insert a single record using an executor. +// See boil.Columns.InsertColumnSet documentation to understand column list inference for inserts. +func (o *Reaction) Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error { + if o == nil { + return errors.New("models: no reactions provided for insertion") + } + + var err error + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + if o.UpdatedAt.IsZero() { + o.UpdatedAt = currTime + } + } + + if err := o.doBeforeInsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(reactionColumnsWithDefault, o) + + key := makeCacheKey(columns, nzDefaults) + reactionInsertCacheMut.RLock() + cache, cached := reactionInsertCache[key] + reactionInsertCacheMut.RUnlock() + + if !cached { + wl, returnColumns := columns.InsertColumnSet( + reactionAllColumns, + reactionColumnsWithDefault, + reactionColumnsWithoutDefault, + nzDefaults, + ) + + cache.valueMapping, err = queries.BindMapping(reactionType, reactionMapping, wl) + if err != nil { + return err + } + cache.retMapping, err = queries.BindMapping(reactionType, reactionMapping, returnColumns) + if err != nil { + return err + } + if len(wl) != 0 { + cache.query = fmt.Sprintf("INSERT INTO \"reactions\" (\"%s\") %%sVALUES (%s)%%s", strings.Join(wl, "\",\""), strmangle.Placeholders(dialect.UseIndexPlaceholders, len(wl), 1, 1)) + } else { + cache.query = "INSERT INTO \"reactions\" %sDEFAULT VALUES%s" + } + + var queryOutput, queryReturning string + + if len(cache.retMapping) != 0 { + queryReturning = fmt.Sprintf(" RETURNING \"%s\"", strings.Join(returnColumns, "\",\"")) + } + + cache.query = fmt.Sprintf(cache.query, queryOutput, queryReturning) + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(queries.PtrsFromMapping(value, cache.retMapping)...) + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + + if err != nil { + return errors.Wrap(err, "models: unable to insert into reactions") + } + + if !cached { + reactionInsertCacheMut.Lock() + reactionInsertCache[key] = cache + reactionInsertCacheMut.Unlock() + } + + return o.doAfterInsertHooks(ctx, exec) +} + +// UpdateG a single Reaction record using the global executor. +// See Update for more documentation. +func (o *Reaction) UpdateG(ctx context.Context, columns boil.Columns) (int64, error) { + return o.Update(ctx, boil.GetContextDB(), columns) +} + +// Update uses an executor to update the Reaction. +// See boil.Columns.UpdateColumnSet documentation to understand column list inference for updates. +// Update does not automatically update the record in case of default values. Use .Reload() to refresh the records. +func (o *Reaction) Update(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) (int64, error) { + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + o.UpdatedAt = currTime + } + + var err error + if err = o.doBeforeUpdateHooks(ctx, exec); err != nil { + return 0, err + } + key := makeCacheKey(columns, nil) + reactionUpdateCacheMut.RLock() + cache, cached := reactionUpdateCache[key] + reactionUpdateCacheMut.RUnlock() + + if !cached { + wl := columns.UpdateColumnSet( + reactionAllColumns, + reactionPrimaryKeyColumns, + ) + + if !columns.IsWhitelist() { + wl = strmangle.SetComplement(wl, []string{"created_at"}) + } + if len(wl) == 0 { + return 0, errors.New("models: unable to update reactions, could not build whitelist") + } + + cache.query = fmt.Sprintf("UPDATE \"reactions\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, wl), + strmangle.WhereClause("\"", "\"", len(wl)+1, reactionPrimaryKeyColumns), + ) + cache.valueMapping, err = queries.BindMapping(reactionType, reactionMapping, append(wl, reactionPrimaryKeyColumns...)) + if err != nil { + return 0, err + } + } + + values := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, values) + } + var result sql.Result + result, err = exec.ExecContext(ctx, cache.query, values...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update reactions row") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by update for reactions") + } + + if !cached { + reactionUpdateCacheMut.Lock() + reactionUpdateCache[key] = cache + reactionUpdateCacheMut.Unlock() + } + + return rowsAff, o.doAfterUpdateHooks(ctx, exec) +} + +// UpdateAllG updates all rows with the specified column values. +func (q reactionQuery) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return q.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values. +func (q reactionQuery) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + queries.SetUpdate(q.Query, cols) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all for reactions") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected for reactions") + } + + return rowsAff, nil +} + +// UpdateAllG updates all rows with the specified column values. +func (o ReactionSlice) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return o.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values, using an executor. +func (o ReactionSlice) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + ln := int64(len(o)) + if ln == 0 { + return 0, nil + } + + if len(cols) == 0 { + return 0, errors.New("models: update all requires at least one column argument") + } + + colNames := make([]string, len(cols)) + args := make([]interface{}, len(cols)) + + i := 0 + for name, value := range cols { + colNames[i] = name + args[i] = value + i++ + } + + // Append all of the primary key values for each column + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), reactionPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := fmt.Sprintf("UPDATE \"reactions\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, colNames), + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), len(colNames)+1, reactionPrimaryKeyColumns, len(o))) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all in reaction slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected all in update all reaction") + } + return rowsAff, nil +} + +// UpsertG attempts an insert, and does an update or ignore on conflict. +func (o *Reaction) UpsertG(ctx context.Context, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + return o.Upsert(ctx, boil.GetContextDB(), updateOnConflict, conflictColumns, updateColumns, insertColumns, opts...) +} + +// Upsert attempts an insert using an executor, and does an update or ignore on conflict. +// See boil.Columns documentation for how to properly use updateColumns and insertColumns. +func (o *Reaction) Upsert(ctx context.Context, exec boil.ContextExecutor, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + if o == nil { + return errors.New("models: no reactions provided for upsert") + } + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + o.UpdatedAt = currTime + } + + if err := o.doBeforeUpsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(reactionColumnsWithDefault, o) + + // Build cache key in-line uglily - mysql vs psql problems + buf := strmangle.GetBuffer() + if updateOnConflict { + buf.WriteByte('t') + } else { + buf.WriteByte('f') + } + buf.WriteByte('.') + for _, c := range conflictColumns { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(updateColumns.Kind)) + for _, c := range updateColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(insertColumns.Kind)) + for _, c := range insertColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + for _, c := range nzDefaults { + buf.WriteString(c) + } + key := buf.String() + strmangle.PutBuffer(buf) + + reactionUpsertCacheMut.RLock() + cache, cached := reactionUpsertCache[key] + reactionUpsertCacheMut.RUnlock() + + var err error + + if !cached { + insert, _ := insertColumns.InsertColumnSet( + reactionAllColumns, + reactionColumnsWithDefault, + reactionColumnsWithoutDefault, + nzDefaults, + ) + + update := updateColumns.UpdateColumnSet( + reactionAllColumns, + reactionPrimaryKeyColumns, + ) + + if updateOnConflict && len(update) == 0 { + return errors.New("models: unable to upsert reactions, could not build update column list") + } + + ret := strmangle.SetComplement(reactionAllColumns, strmangle.SetIntersect(insert, update)) + + conflict := conflictColumns + if len(conflict) == 0 && updateOnConflict && len(update) != 0 { + if len(reactionPrimaryKeyColumns) == 0 { + return errors.New("models: unable to upsert reactions, could not build conflict column list") + } + + conflict = make([]string, len(reactionPrimaryKeyColumns)) + copy(conflict, reactionPrimaryKeyColumns) + } + cache.query = buildUpsertQueryPostgres(dialect, "\"reactions\"", updateOnConflict, ret, update, conflict, insert, opts...) + + cache.valueMapping, err = queries.BindMapping(reactionType, reactionMapping, insert) + if err != nil { + return err + } + if len(ret) != 0 { + cache.retMapping, err = queries.BindMapping(reactionType, reactionMapping, ret) + if err != nil { + return err + } + } + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + var returns []interface{} + if len(cache.retMapping) != 0 { + returns = queries.PtrsFromMapping(value, cache.retMapping) + } + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(returns...) + if errors.Is(err, sql.ErrNoRows) { + err = nil // Postgres doesn't return anything when there's no update + } + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + if err != nil { + return errors.Wrap(err, "models: unable to upsert reactions") + } + + if !cached { + reactionUpsertCacheMut.Lock() + reactionUpsertCache[key] = cache + reactionUpsertCacheMut.Unlock() + } + + return o.doAfterUpsertHooks(ctx, exec) +} + +// DeleteG deletes a single Reaction record. +// DeleteG will match against the primary key column to find the record to delete. +func (o *Reaction) DeleteG(ctx context.Context) (int64, error) { + return o.Delete(ctx, boil.GetContextDB()) +} + +// Delete deletes a single Reaction record with an executor. +// Delete will match against the primary key column to find the record to delete. +func (o *Reaction) Delete(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if o == nil { + return 0, errors.New("models: no Reaction provided for delete") + } + + if err := o.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + args := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), reactionPrimaryKeyMapping) + sql := "DELETE FROM \"reactions\" WHERE \"id\"=$1" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete from reactions") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by delete for reactions") + } + + if err := o.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + return rowsAff, nil +} + +func (q reactionQuery) DeleteAllG(ctx context.Context) (int64, error) { + return q.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all matching rows. +func (q reactionQuery) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if q.Query == nil { + return 0, errors.New("models: no reactionQuery provided for delete all") + } + + queries.SetDelete(q.Query) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from reactions") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for reactions") + } + + return rowsAff, nil +} + +// DeleteAllG deletes all rows in the slice. +func (o ReactionSlice) DeleteAllG(ctx context.Context) (int64, error) { + return o.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all rows in the slice, using an executor. +func (o ReactionSlice) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if len(o) == 0 { + return 0, nil + } + + if len(reactionBeforeDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + var args []interface{} + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), reactionPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "DELETE FROM \"reactions\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, reactionPrimaryKeyColumns, len(o)) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from reaction slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for reactions") + } + + if len(reactionAfterDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + return rowsAff, nil +} + +// ReloadG refetches the object from the database using the primary keys. +func (o *Reaction) ReloadG(ctx context.Context) error { + if o == nil { + return errors.New("models: no Reaction provided for reload") + } + + return o.Reload(ctx, boil.GetContextDB()) +} + +// Reload refetches the object from the database +// using the primary keys with an executor. +func (o *Reaction) Reload(ctx context.Context, exec boil.ContextExecutor) error { + ret, err := FindReaction(ctx, exec, o.ID) + if err != nil { + return err + } + + *o = *ret + return nil +} + +// ReloadAllG refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *ReactionSlice) ReloadAllG(ctx context.Context) error { + if o == nil { + return errors.New("models: empty ReactionSlice provided for reload all") + } + + return o.ReloadAll(ctx, boil.GetContextDB()) +} + +// ReloadAll refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *ReactionSlice) ReloadAll(ctx context.Context, exec boil.ContextExecutor) error { + if o == nil || len(*o) == 0 { + return nil + } + + slice := ReactionSlice{} + var args []interface{} + for _, obj := range *o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), reactionPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "SELECT \"reactions\".* FROM \"reactions\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, reactionPrimaryKeyColumns, len(*o)) + + q := queries.Raw(sql, args...) + + err := q.Bind(ctx, exec, &slice) + if err != nil { + return errors.Wrap(err, "models: unable to reload all in ReactionSlice") + } + + *o = slice + + return nil +} + +// ReactionExistsG checks if the Reaction row exists. +func ReactionExistsG(ctx context.Context, iD string) (bool, error) { + return ReactionExists(ctx, boil.GetContextDB(), iD) +} + +// ReactionExists checks if the Reaction row exists. +func ReactionExists(ctx context.Context, exec boil.ContextExecutor, iD string) (bool, error) { + var exists bool + sql := "select exists(select 1 from \"reactions\" where \"id\"=$1 limit 1)" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, iD) + } + row := exec.QueryRowContext(ctx, sql, iD) + + err := row.Scan(&exists) + if err != nil { + return false, errors.Wrap(err, "models: unable to check if reactions exists") + } + + return exists, nil +} + +// Exists checks if the Reaction row exists. +func (o *Reaction) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + return ReactionExists(ctx, exec, o.ID) +} diff --git a/models/schema_migrations.go b/models/schema_migrations.go new file mode 100644 index 0000000..8d2e685 --- /dev/null +++ b/models/schema_migrations.go @@ -0,0 +1,1050 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "context" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/friendsofgo/errors" + "github.com/volatiletech/sqlboiler/v4/boil" + "github.com/volatiletech/sqlboiler/v4/queries" + "github.com/volatiletech/sqlboiler/v4/queries/qm" + "github.com/volatiletech/sqlboiler/v4/queries/qmhelper" + "github.com/volatiletech/strmangle" +) + +// SchemaMigration is an object representing the database table. +type SchemaMigration struct { + Version int64 `boil:"version" json:"version" toml:"version" yaml:"version"` + Dirty bool `boil:"dirty" json:"dirty" toml:"dirty" yaml:"dirty"` + + R *schemaMigrationR `boil:"-" json:"-" toml:"-" yaml:"-"` + L schemaMigrationL `boil:"-" json:"-" toml:"-" yaml:"-"` +} + +var SchemaMigrationColumns = struct { + Version string + Dirty string +}{ + Version: "version", + Dirty: "dirty", +} + +var SchemaMigrationTableColumns = struct { + Version string + Dirty string +}{ + Version: "schema_migrations.version", + Dirty: "schema_migrations.dirty", +} + +// Generated where + +type whereHelperint64 struct{ field string } + +func (w whereHelperint64) EQ(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.EQ, x) } +func (w whereHelperint64) NEQ(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.NEQ, x) } +func (w whereHelperint64) LT(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LT, x) } +func (w whereHelperint64) LTE(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LTE, x) } +func (w whereHelperint64) GT(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GT, x) } +func (w whereHelperint64) GTE(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GTE, x) } +func (w whereHelperint64) IN(slice []int64) qm.QueryMod { + values := make([]interface{}, 0, len(slice)) + for _, value := range slice { + values = append(values, value) + } + return qm.WhereIn(fmt.Sprintf("%s IN ?", w.field), values...) +} +func (w whereHelperint64) NIN(slice []int64) qm.QueryMod { + values := make([]interface{}, 0, len(slice)) + for _, value := range slice { + values = append(values, value) + } + return qm.WhereNotIn(fmt.Sprintf("%s NOT IN ?", w.field), values...) +} + +type whereHelperbool struct{ field string } + +func (w whereHelperbool) EQ(x bool) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.EQ, x) } +func (w whereHelperbool) NEQ(x bool) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.NEQ, x) } +func (w whereHelperbool) LT(x bool) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LT, x) } +func (w whereHelperbool) LTE(x bool) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LTE, x) } +func (w whereHelperbool) GT(x bool) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GT, x) } +func (w whereHelperbool) GTE(x bool) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GTE, x) } + +var SchemaMigrationWhere = struct { + Version whereHelperint64 + Dirty whereHelperbool +}{ + Version: whereHelperint64{field: "\"schema_migrations\".\"version\""}, + Dirty: whereHelperbool{field: "\"schema_migrations\".\"dirty\""}, +} + +// SchemaMigrationRels is where relationship names are stored. +var SchemaMigrationRels = struct { +}{} + +// schemaMigrationR is where relationships are stored. +type schemaMigrationR struct { +} + +// NewStruct creates a new relationship struct +func (*schemaMigrationR) NewStruct() *schemaMigrationR { + return &schemaMigrationR{} +} + +// schemaMigrationL is where Load methods for each relationship are stored. +type schemaMigrationL struct{} + +var ( + schemaMigrationAllColumns = []string{"version", "dirty"} + schemaMigrationColumnsWithoutDefault = []string{"version", "dirty"} + schemaMigrationColumnsWithDefault = []string{} + schemaMigrationPrimaryKeyColumns = []string{"version"} + schemaMigrationGeneratedColumns = []string{} +) + +type ( + // SchemaMigrationSlice is an alias for a slice of pointers to SchemaMigration. + // This should almost always be used instead of []SchemaMigration. + SchemaMigrationSlice []*SchemaMigration + // SchemaMigrationHook is the signature for custom SchemaMigration hook methods + SchemaMigrationHook func(context.Context, boil.ContextExecutor, *SchemaMigration) error + + schemaMigrationQuery struct { + *queries.Query + } +) + +// Cache for insert, update and upsert +var ( + schemaMigrationType = reflect.TypeOf(&SchemaMigration{}) + schemaMigrationMapping = queries.MakeStructMapping(schemaMigrationType) + schemaMigrationPrimaryKeyMapping, _ = queries.BindMapping(schemaMigrationType, schemaMigrationMapping, schemaMigrationPrimaryKeyColumns) + schemaMigrationInsertCacheMut sync.RWMutex + schemaMigrationInsertCache = make(map[string]insertCache) + schemaMigrationUpdateCacheMut sync.RWMutex + schemaMigrationUpdateCache = make(map[string]updateCache) + schemaMigrationUpsertCacheMut sync.RWMutex + schemaMigrationUpsertCache = make(map[string]insertCache) +) + +var ( + // Force time package dependency for automated UpdatedAt/CreatedAt. + _ = time.Second + // Force qmhelper dependency for where clause generation (which doesn't + // always happen) + _ = qmhelper.Where +) + +var schemaMigrationAfterSelectMu sync.Mutex +var schemaMigrationAfterSelectHooks []SchemaMigrationHook + +var schemaMigrationBeforeInsertMu sync.Mutex +var schemaMigrationBeforeInsertHooks []SchemaMigrationHook +var schemaMigrationAfterInsertMu sync.Mutex +var schemaMigrationAfterInsertHooks []SchemaMigrationHook + +var schemaMigrationBeforeUpdateMu sync.Mutex +var schemaMigrationBeforeUpdateHooks []SchemaMigrationHook +var schemaMigrationAfterUpdateMu sync.Mutex +var schemaMigrationAfterUpdateHooks []SchemaMigrationHook + +var schemaMigrationBeforeDeleteMu sync.Mutex +var schemaMigrationBeforeDeleteHooks []SchemaMigrationHook +var schemaMigrationAfterDeleteMu sync.Mutex +var schemaMigrationAfterDeleteHooks []SchemaMigrationHook + +var schemaMigrationBeforeUpsertMu sync.Mutex +var schemaMigrationBeforeUpsertHooks []SchemaMigrationHook +var schemaMigrationAfterUpsertMu sync.Mutex +var schemaMigrationAfterUpsertHooks []SchemaMigrationHook + +// doAfterSelectHooks executes all "after Select" hooks. +func (o *SchemaMigration) doAfterSelectHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationAfterSelectHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeInsertHooks executes all "before insert" hooks. +func (o *SchemaMigration) doBeforeInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationBeforeInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterInsertHooks executes all "after Insert" hooks. +func (o *SchemaMigration) doAfterInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationAfterInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpdateHooks executes all "before Update" hooks. +func (o *SchemaMigration) doBeforeUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationBeforeUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpdateHooks executes all "after Update" hooks. +func (o *SchemaMigration) doAfterUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationAfterUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeDeleteHooks executes all "before Delete" hooks. +func (o *SchemaMigration) doBeforeDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationBeforeDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterDeleteHooks executes all "after Delete" hooks. +func (o *SchemaMigration) doAfterDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationAfterDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpsertHooks executes all "before Upsert" hooks. +func (o *SchemaMigration) doBeforeUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationBeforeUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpsertHooks executes all "after Upsert" hooks. +func (o *SchemaMigration) doAfterUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range schemaMigrationAfterUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// AddSchemaMigrationHook registers your hook function for all future operations. +func AddSchemaMigrationHook(hookPoint boil.HookPoint, schemaMigrationHook SchemaMigrationHook) { + switch hookPoint { + case boil.AfterSelectHook: + schemaMigrationAfterSelectMu.Lock() + schemaMigrationAfterSelectHooks = append(schemaMigrationAfterSelectHooks, schemaMigrationHook) + schemaMigrationAfterSelectMu.Unlock() + case boil.BeforeInsertHook: + schemaMigrationBeforeInsertMu.Lock() + schemaMigrationBeforeInsertHooks = append(schemaMigrationBeforeInsertHooks, schemaMigrationHook) + schemaMigrationBeforeInsertMu.Unlock() + case boil.AfterInsertHook: + schemaMigrationAfterInsertMu.Lock() + schemaMigrationAfterInsertHooks = append(schemaMigrationAfterInsertHooks, schemaMigrationHook) + schemaMigrationAfterInsertMu.Unlock() + case boil.BeforeUpdateHook: + schemaMigrationBeforeUpdateMu.Lock() + schemaMigrationBeforeUpdateHooks = append(schemaMigrationBeforeUpdateHooks, schemaMigrationHook) + schemaMigrationBeforeUpdateMu.Unlock() + case boil.AfterUpdateHook: + schemaMigrationAfterUpdateMu.Lock() + schemaMigrationAfterUpdateHooks = append(schemaMigrationAfterUpdateHooks, schemaMigrationHook) + schemaMigrationAfterUpdateMu.Unlock() + case boil.BeforeDeleteHook: + schemaMigrationBeforeDeleteMu.Lock() + schemaMigrationBeforeDeleteHooks = append(schemaMigrationBeforeDeleteHooks, schemaMigrationHook) + schemaMigrationBeforeDeleteMu.Unlock() + case boil.AfterDeleteHook: + schemaMigrationAfterDeleteMu.Lock() + schemaMigrationAfterDeleteHooks = append(schemaMigrationAfterDeleteHooks, schemaMigrationHook) + schemaMigrationAfterDeleteMu.Unlock() + case boil.BeforeUpsertHook: + schemaMigrationBeforeUpsertMu.Lock() + schemaMigrationBeforeUpsertHooks = append(schemaMigrationBeforeUpsertHooks, schemaMigrationHook) + schemaMigrationBeforeUpsertMu.Unlock() + case boil.AfterUpsertHook: + schemaMigrationAfterUpsertMu.Lock() + schemaMigrationAfterUpsertHooks = append(schemaMigrationAfterUpsertHooks, schemaMigrationHook) + schemaMigrationAfterUpsertMu.Unlock() + } +} + +// OneG returns a single schemaMigration record from the query using the global executor. +func (q schemaMigrationQuery) OneG(ctx context.Context) (*SchemaMigration, error) { + return q.One(ctx, boil.GetContextDB()) +} + +// One returns a single schemaMigration record from the query. +func (q schemaMigrationQuery) One(ctx context.Context, exec boil.ContextExecutor) (*SchemaMigration, error) { + o := &SchemaMigration{} + + queries.SetLimit(q.Query, 1) + + err := q.Bind(ctx, exec, o) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: failed to execute a one query for schema_migrations") + } + + if err := o.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + + return o, nil +} + +// AllG returns all SchemaMigration records from the query using the global executor. +func (q schemaMigrationQuery) AllG(ctx context.Context) (SchemaMigrationSlice, error) { + return q.All(ctx, boil.GetContextDB()) +} + +// All returns all SchemaMigration records from the query. +func (q schemaMigrationQuery) All(ctx context.Context, exec boil.ContextExecutor) (SchemaMigrationSlice, error) { + var o []*SchemaMigration + + err := q.Bind(ctx, exec, &o) + if err != nil { + return nil, errors.Wrap(err, "models: failed to assign all query results to SchemaMigration slice") + } + + if len(schemaMigrationAfterSelectHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + } + } + + return o, nil +} + +// CountG returns the count of all SchemaMigration records in the query using the global executor +func (q schemaMigrationQuery) CountG(ctx context.Context) (int64, error) { + return q.Count(ctx, boil.GetContextDB()) +} + +// Count returns the count of all SchemaMigration records in the query. +func (q schemaMigrationQuery) Count(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return 0, errors.Wrap(err, "models: failed to count schema_migrations rows") + } + + return count, nil +} + +// ExistsG checks if the row exists in the table using the global executor. +func (q schemaMigrationQuery) ExistsG(ctx context.Context) (bool, error) { + return q.Exists(ctx, boil.GetContextDB()) +} + +// Exists checks if the row exists in the table. +func (q schemaMigrationQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + queries.SetLimit(q.Query, 1) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return false, errors.Wrap(err, "models: failed to check if schema_migrations exists") + } + + return count > 0, nil +} + +// SchemaMigrations retrieves all the records using an executor. +func SchemaMigrations(mods ...qm.QueryMod) schemaMigrationQuery { + mods = append(mods, qm.From("\"schema_migrations\"")) + q := NewQuery(mods...) + if len(queries.GetSelect(q)) == 0 { + queries.SetSelect(q, []string{"\"schema_migrations\".*"}) + } + + return schemaMigrationQuery{q} +} + +// FindSchemaMigrationG retrieves a single record by ID. +func FindSchemaMigrationG(ctx context.Context, version int64, selectCols ...string) (*SchemaMigration, error) { + return FindSchemaMigration(ctx, boil.GetContextDB(), version, selectCols...) +} + +// FindSchemaMigration retrieves a single record by ID with an executor. +// If selectCols is empty Find will return all columns. +func FindSchemaMigration(ctx context.Context, exec boil.ContextExecutor, version int64, selectCols ...string) (*SchemaMigration, error) { + schemaMigrationObj := &SchemaMigration{} + + sel := "*" + if len(selectCols) > 0 { + sel = strings.Join(strmangle.IdentQuoteSlice(dialect.LQ, dialect.RQ, selectCols), ",") + } + query := fmt.Sprintf( + "select %s from \"schema_migrations\" where \"version\"=$1", sel, + ) + + q := queries.Raw(query, version) + + err := q.Bind(ctx, exec, schemaMigrationObj) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: unable to select from schema_migrations") + } + + if err = schemaMigrationObj.doAfterSelectHooks(ctx, exec); err != nil { + return schemaMigrationObj, err + } + + return schemaMigrationObj, nil +} + +// InsertG a single record. See Insert for whitelist behavior description. +func (o *SchemaMigration) InsertG(ctx context.Context, columns boil.Columns) error { + return o.Insert(ctx, boil.GetContextDB(), columns) +} + +// Insert a single record using an executor. +// See boil.Columns.InsertColumnSet documentation to understand column list inference for inserts. +func (o *SchemaMigration) Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error { + if o == nil { + return errors.New("models: no schema_migrations provided for insertion") + } + + var err error + + if err := o.doBeforeInsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(schemaMigrationColumnsWithDefault, o) + + key := makeCacheKey(columns, nzDefaults) + schemaMigrationInsertCacheMut.RLock() + cache, cached := schemaMigrationInsertCache[key] + schemaMigrationInsertCacheMut.RUnlock() + + if !cached { + wl, returnColumns := columns.InsertColumnSet( + schemaMigrationAllColumns, + schemaMigrationColumnsWithDefault, + schemaMigrationColumnsWithoutDefault, + nzDefaults, + ) + + cache.valueMapping, err = queries.BindMapping(schemaMigrationType, schemaMigrationMapping, wl) + if err != nil { + return err + } + cache.retMapping, err = queries.BindMapping(schemaMigrationType, schemaMigrationMapping, returnColumns) + if err != nil { + return err + } + if len(wl) != 0 { + cache.query = fmt.Sprintf("INSERT INTO \"schema_migrations\" (\"%s\") %%sVALUES (%s)%%s", strings.Join(wl, "\",\""), strmangle.Placeholders(dialect.UseIndexPlaceholders, len(wl), 1, 1)) + } else { + cache.query = "INSERT INTO \"schema_migrations\" %sDEFAULT VALUES%s" + } + + var queryOutput, queryReturning string + + if len(cache.retMapping) != 0 { + queryReturning = fmt.Sprintf(" RETURNING \"%s\"", strings.Join(returnColumns, "\",\"")) + } + + cache.query = fmt.Sprintf(cache.query, queryOutput, queryReturning) + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(queries.PtrsFromMapping(value, cache.retMapping)...) + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + + if err != nil { + return errors.Wrap(err, "models: unable to insert into schema_migrations") + } + + if !cached { + schemaMigrationInsertCacheMut.Lock() + schemaMigrationInsertCache[key] = cache + schemaMigrationInsertCacheMut.Unlock() + } + + return o.doAfterInsertHooks(ctx, exec) +} + +// UpdateG a single SchemaMigration record using the global executor. +// See Update for more documentation. +func (o *SchemaMigration) UpdateG(ctx context.Context, columns boil.Columns) (int64, error) { + return o.Update(ctx, boil.GetContextDB(), columns) +} + +// Update uses an executor to update the SchemaMigration. +// See boil.Columns.UpdateColumnSet documentation to understand column list inference for updates. +// Update does not automatically update the record in case of default values. Use .Reload() to refresh the records. +func (o *SchemaMigration) Update(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) (int64, error) { + var err error + if err = o.doBeforeUpdateHooks(ctx, exec); err != nil { + return 0, err + } + key := makeCacheKey(columns, nil) + schemaMigrationUpdateCacheMut.RLock() + cache, cached := schemaMigrationUpdateCache[key] + schemaMigrationUpdateCacheMut.RUnlock() + + if !cached { + wl := columns.UpdateColumnSet( + schemaMigrationAllColumns, + schemaMigrationPrimaryKeyColumns, + ) + + if !columns.IsWhitelist() { + wl = strmangle.SetComplement(wl, []string{"created_at"}) + } + if len(wl) == 0 { + return 0, errors.New("models: unable to update schema_migrations, could not build whitelist") + } + + cache.query = fmt.Sprintf("UPDATE \"schema_migrations\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, wl), + strmangle.WhereClause("\"", "\"", len(wl)+1, schemaMigrationPrimaryKeyColumns), + ) + cache.valueMapping, err = queries.BindMapping(schemaMigrationType, schemaMigrationMapping, append(wl, schemaMigrationPrimaryKeyColumns...)) + if err != nil { + return 0, err + } + } + + values := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, values) + } + var result sql.Result + result, err = exec.ExecContext(ctx, cache.query, values...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update schema_migrations row") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by update for schema_migrations") + } + + if !cached { + schemaMigrationUpdateCacheMut.Lock() + schemaMigrationUpdateCache[key] = cache + schemaMigrationUpdateCacheMut.Unlock() + } + + return rowsAff, o.doAfterUpdateHooks(ctx, exec) +} + +// UpdateAllG updates all rows with the specified column values. +func (q schemaMigrationQuery) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return q.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values. +func (q schemaMigrationQuery) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + queries.SetUpdate(q.Query, cols) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all for schema_migrations") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected for schema_migrations") + } + + return rowsAff, nil +} + +// UpdateAllG updates all rows with the specified column values. +func (o SchemaMigrationSlice) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return o.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values, using an executor. +func (o SchemaMigrationSlice) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + ln := int64(len(o)) + if ln == 0 { + return 0, nil + } + + if len(cols) == 0 { + return 0, errors.New("models: update all requires at least one column argument") + } + + colNames := make([]string, len(cols)) + args := make([]interface{}, len(cols)) + + i := 0 + for name, value := range cols { + colNames[i] = name + args[i] = value + i++ + } + + // Append all of the primary key values for each column + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), schemaMigrationPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := fmt.Sprintf("UPDATE \"schema_migrations\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, colNames), + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), len(colNames)+1, schemaMigrationPrimaryKeyColumns, len(o))) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all in schemaMigration slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected all in update all schemaMigration") + } + return rowsAff, nil +} + +// UpsertG attempts an insert, and does an update or ignore on conflict. +func (o *SchemaMigration) UpsertG(ctx context.Context, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + return o.Upsert(ctx, boil.GetContextDB(), updateOnConflict, conflictColumns, updateColumns, insertColumns, opts...) +} + +// Upsert attempts an insert using an executor, and does an update or ignore on conflict. +// See boil.Columns documentation for how to properly use updateColumns and insertColumns. +func (o *SchemaMigration) Upsert(ctx context.Context, exec boil.ContextExecutor, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + if o == nil { + return errors.New("models: no schema_migrations provided for upsert") + } + + if err := o.doBeforeUpsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(schemaMigrationColumnsWithDefault, o) + + // Build cache key in-line uglily - mysql vs psql problems + buf := strmangle.GetBuffer() + if updateOnConflict { + buf.WriteByte('t') + } else { + buf.WriteByte('f') + } + buf.WriteByte('.') + for _, c := range conflictColumns { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(updateColumns.Kind)) + for _, c := range updateColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(insertColumns.Kind)) + for _, c := range insertColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + for _, c := range nzDefaults { + buf.WriteString(c) + } + key := buf.String() + strmangle.PutBuffer(buf) + + schemaMigrationUpsertCacheMut.RLock() + cache, cached := schemaMigrationUpsertCache[key] + schemaMigrationUpsertCacheMut.RUnlock() + + var err error + + if !cached { + insert, _ := insertColumns.InsertColumnSet( + schemaMigrationAllColumns, + schemaMigrationColumnsWithDefault, + schemaMigrationColumnsWithoutDefault, + nzDefaults, + ) + + update := updateColumns.UpdateColumnSet( + schemaMigrationAllColumns, + schemaMigrationPrimaryKeyColumns, + ) + + if updateOnConflict && len(update) == 0 { + return errors.New("models: unable to upsert schema_migrations, could not build update column list") + } + + ret := strmangle.SetComplement(schemaMigrationAllColumns, strmangle.SetIntersect(insert, update)) + + conflict := conflictColumns + if len(conflict) == 0 && updateOnConflict && len(update) != 0 { + if len(schemaMigrationPrimaryKeyColumns) == 0 { + return errors.New("models: unable to upsert schema_migrations, could not build conflict column list") + } + + conflict = make([]string, len(schemaMigrationPrimaryKeyColumns)) + copy(conflict, schemaMigrationPrimaryKeyColumns) + } + cache.query = buildUpsertQueryPostgres(dialect, "\"schema_migrations\"", updateOnConflict, ret, update, conflict, insert, opts...) + + cache.valueMapping, err = queries.BindMapping(schemaMigrationType, schemaMigrationMapping, insert) + if err != nil { + return err + } + if len(ret) != 0 { + cache.retMapping, err = queries.BindMapping(schemaMigrationType, schemaMigrationMapping, ret) + if err != nil { + return err + } + } + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + var returns []interface{} + if len(cache.retMapping) != 0 { + returns = queries.PtrsFromMapping(value, cache.retMapping) + } + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(returns...) + if errors.Is(err, sql.ErrNoRows) { + err = nil // Postgres doesn't return anything when there's no update + } + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + if err != nil { + return errors.Wrap(err, "models: unable to upsert schema_migrations") + } + + if !cached { + schemaMigrationUpsertCacheMut.Lock() + schemaMigrationUpsertCache[key] = cache + schemaMigrationUpsertCacheMut.Unlock() + } + + return o.doAfterUpsertHooks(ctx, exec) +} + +// DeleteG deletes a single SchemaMigration record. +// DeleteG will match against the primary key column to find the record to delete. +func (o *SchemaMigration) DeleteG(ctx context.Context) (int64, error) { + return o.Delete(ctx, boil.GetContextDB()) +} + +// Delete deletes a single SchemaMigration record with an executor. +// Delete will match against the primary key column to find the record to delete. +func (o *SchemaMigration) Delete(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if o == nil { + return 0, errors.New("models: no SchemaMigration provided for delete") + } + + if err := o.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + args := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), schemaMigrationPrimaryKeyMapping) + sql := "DELETE FROM \"schema_migrations\" WHERE \"version\"=$1" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete from schema_migrations") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by delete for schema_migrations") + } + + if err := o.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + return rowsAff, nil +} + +func (q schemaMigrationQuery) DeleteAllG(ctx context.Context) (int64, error) { + return q.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all matching rows. +func (q schemaMigrationQuery) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if q.Query == nil { + return 0, errors.New("models: no schemaMigrationQuery provided for delete all") + } + + queries.SetDelete(q.Query) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from schema_migrations") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for schema_migrations") + } + + return rowsAff, nil +} + +// DeleteAllG deletes all rows in the slice. +func (o SchemaMigrationSlice) DeleteAllG(ctx context.Context) (int64, error) { + return o.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all rows in the slice, using an executor. +func (o SchemaMigrationSlice) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if len(o) == 0 { + return 0, nil + } + + if len(schemaMigrationBeforeDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + var args []interface{} + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), schemaMigrationPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "DELETE FROM \"schema_migrations\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, schemaMigrationPrimaryKeyColumns, len(o)) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from schemaMigration slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for schema_migrations") + } + + if len(schemaMigrationAfterDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + return rowsAff, nil +} + +// ReloadG refetches the object from the database using the primary keys. +func (o *SchemaMigration) ReloadG(ctx context.Context) error { + if o == nil { + return errors.New("models: no SchemaMigration provided for reload") + } + + return o.Reload(ctx, boil.GetContextDB()) +} + +// Reload refetches the object from the database +// using the primary keys with an executor. +func (o *SchemaMigration) Reload(ctx context.Context, exec boil.ContextExecutor) error { + ret, err := FindSchemaMigration(ctx, exec, o.Version) + if err != nil { + return err + } + + *o = *ret + return nil +} + +// ReloadAllG refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *SchemaMigrationSlice) ReloadAllG(ctx context.Context) error { + if o == nil { + return errors.New("models: empty SchemaMigrationSlice provided for reload all") + } + + return o.ReloadAll(ctx, boil.GetContextDB()) +} + +// ReloadAll refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *SchemaMigrationSlice) ReloadAll(ctx context.Context, exec boil.ContextExecutor) error { + if o == nil || len(*o) == 0 { + return nil + } + + slice := SchemaMigrationSlice{} + var args []interface{} + for _, obj := range *o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), schemaMigrationPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "SELECT \"schema_migrations\".* FROM \"schema_migrations\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, schemaMigrationPrimaryKeyColumns, len(*o)) + + q := queries.Raw(sql, args...) + + err := q.Bind(ctx, exec, &slice) + if err != nil { + return errors.Wrap(err, "models: unable to reload all in SchemaMigrationSlice") + } + + *o = slice + + return nil +} + +// SchemaMigrationExistsG checks if the SchemaMigration row exists. +func SchemaMigrationExistsG(ctx context.Context, version int64) (bool, error) { + return SchemaMigrationExists(ctx, boil.GetContextDB(), version) +} + +// SchemaMigrationExists checks if the SchemaMigration row exists. +func SchemaMigrationExists(ctx context.Context, exec boil.ContextExecutor, version int64) (bool, error) { + var exists bool + sql := "select exists(select 1 from \"schema_migrations\" where \"version\"=$1 limit 1)" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, version) + } + row := exec.QueryRowContext(ctx, sql, version) + + err := row.Scan(&exists) + if err != nil { + return false, errors.Wrap(err, "models: unable to check if schema_migrations exists") + } + + return exists, nil +} + +// Exists checks if the SchemaMigration row exists. +func (o *SchemaMigration) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + return SchemaMigrationExists(ctx, exec, o.Version) +} diff --git a/models/text_notes.go b/models/text_notes.go new file mode 100644 index 0000000..9b8917a --- /dev/null +++ b/models/text_notes.go @@ -0,0 +1,1627 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "context" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/friendsofgo/errors" + "github.com/volatiletech/null/v8" + "github.com/volatiletech/sqlboiler/v4/boil" + "github.com/volatiletech/sqlboiler/v4/queries" + "github.com/volatiletech/sqlboiler/v4/queries/qm" + "github.com/volatiletech/sqlboiler/v4/queries/qmhelper" + "github.com/volatiletech/sqlboiler/v4/types" + "github.com/volatiletech/strmangle" +) + +// TextNote is an object representing the database table. +type TextNote struct { + ID string `boil:"id" json:"id" toml:"id" yaml:"id"` + E types.StringArray `boil:"e" json:"e,omitempty" toml:"e" yaml:"e,omitempty"` + P types.StringArray `boil:"p" json:"p,omitempty" toml:"p" yaml:"p,omitempty"` + Content null.String `boil:"content" json:"content,omitempty" toml:"content" yaml:"content,omitempty"` + Event types.JSON `boil:"event" json:"event" toml:"event" yaml:"event"` + CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"` + UpdatedAt time.Time `boil:"updated_at" json:"updated_at" toml:"updated_at" yaml:"updated_at"` + DeletedAt null.Time `boil:"deleted_at" json:"deleted_at,omitempty" toml:"deleted_at" yaml:"deleted_at,omitempty"` + UsersMetadatapubKey null.String `boil:"users_metadatapub_key" json:"users_metadatapub_key,omitempty" toml:"users_metadatapub_key" yaml:"users_metadatapub_key,omitempty"` + + R *textNoteR `boil:"-" json:"-" toml:"-" yaml:"-"` + L textNoteL `boil:"-" json:"-" toml:"-" yaml:"-"` +} + +var TextNoteColumns = struct { + ID string + E string + P string + Content string + Event string + CreatedAt string + UpdatedAt string + DeletedAt string + UsersMetadatapubKey string +}{ + ID: "id", + E: "e", + P: "p", + Content: "content", + Event: "event", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + UsersMetadatapubKey: "users_metadatapub_key", +} + +var TextNoteTableColumns = struct { + ID string + E string + P string + Content string + Event string + CreatedAt string + UpdatedAt string + DeletedAt string + UsersMetadatapubKey string +}{ + ID: "text_notes.id", + E: "text_notes.e", + P: "text_notes.p", + Content: "text_notes.content", + Event: "text_notes.event", + CreatedAt: "text_notes.created_at", + UpdatedAt: "text_notes.updated_at", + DeletedAt: "text_notes.deleted_at", + UsersMetadatapubKey: "text_notes.users_metadatapub_key", +} + +// Generated where + +var TextNoteWhere = struct { + ID whereHelperstring + E whereHelpertypes_StringArray + P whereHelpertypes_StringArray + Content whereHelpernull_String + Event whereHelpertypes_JSON + CreatedAt whereHelpertime_Time + UpdatedAt whereHelpertime_Time + DeletedAt whereHelpernull_Time + UsersMetadatapubKey whereHelpernull_String +}{ + ID: whereHelperstring{field: "\"text_notes\".\"id\""}, + E: whereHelpertypes_StringArray{field: "\"text_notes\".\"e\""}, + P: whereHelpertypes_StringArray{field: "\"text_notes\".\"p\""}, + Content: whereHelpernull_String{field: "\"text_notes\".\"content\""}, + Event: whereHelpertypes_JSON{field: "\"text_notes\".\"event\""}, + CreatedAt: whereHelpertime_Time{field: "\"text_notes\".\"created_at\""}, + UpdatedAt: whereHelpertime_Time{field: "\"text_notes\".\"updated_at\""}, + DeletedAt: whereHelpernull_Time{field: "\"text_notes\".\"deleted_at\""}, + UsersMetadatapubKey: whereHelpernull_String{field: "\"text_notes\".\"users_metadatapub_key\""}, +} + +// TextNoteRels is where relationship names are stored. +var TextNoteRels = struct { + UsersMetadatapubKeyUsersMetadatum string + TextNotesidReactions string +}{ + UsersMetadatapubKeyUsersMetadatum: "UsersMetadatapubKeyUsersMetadatum", + TextNotesidReactions: "TextNotesidReactions", +} + +// textNoteR is where relationships are stored. +type textNoteR struct { + UsersMetadatapubKeyUsersMetadatum *UsersMetadatum `boil:"UsersMetadatapubKeyUsersMetadatum" json:"UsersMetadatapubKeyUsersMetadatum" toml:"UsersMetadatapubKeyUsersMetadatum" yaml:"UsersMetadatapubKeyUsersMetadatum"` + TextNotesidReactions ReactionSlice `boil:"TextNotesidReactions" json:"TextNotesidReactions" toml:"TextNotesidReactions" yaml:"TextNotesidReactions"` +} + +// NewStruct creates a new relationship struct +func (*textNoteR) NewStruct() *textNoteR { + return &textNoteR{} +} + +func (r *textNoteR) GetUsersMetadatapubKeyUsersMetadatum() *UsersMetadatum { + if r == nil { + return nil + } + return r.UsersMetadatapubKeyUsersMetadatum +} + +func (r *textNoteR) GetTextNotesidReactions() ReactionSlice { + if r == nil { + return nil + } + return r.TextNotesidReactions +} + +// textNoteL is where Load methods for each relationship are stored. +type textNoteL struct{} + +var ( + textNoteAllColumns = []string{"id", "e", "p", "content", "event", "created_at", "updated_at", "deleted_at", "users_metadatapub_key"} + textNoteColumnsWithoutDefault = []string{"id", "event"} + textNoteColumnsWithDefault = []string{"e", "p", "content", "created_at", "updated_at", "deleted_at", "users_metadatapub_key"} + textNotePrimaryKeyColumns = []string{"id"} + textNoteGeneratedColumns = []string{} +) + +type ( + // TextNoteSlice is an alias for a slice of pointers to TextNote. + // This should almost always be used instead of []TextNote. + TextNoteSlice []*TextNote + // TextNoteHook is the signature for custom TextNote hook methods + TextNoteHook func(context.Context, boil.ContextExecutor, *TextNote) error + + textNoteQuery struct { + *queries.Query + } +) + +// Cache for insert, update and upsert +var ( + textNoteType = reflect.TypeOf(&TextNote{}) + textNoteMapping = queries.MakeStructMapping(textNoteType) + textNotePrimaryKeyMapping, _ = queries.BindMapping(textNoteType, textNoteMapping, textNotePrimaryKeyColumns) + textNoteInsertCacheMut sync.RWMutex + textNoteInsertCache = make(map[string]insertCache) + textNoteUpdateCacheMut sync.RWMutex + textNoteUpdateCache = make(map[string]updateCache) + textNoteUpsertCacheMut sync.RWMutex + textNoteUpsertCache = make(map[string]insertCache) +) + +var ( + // Force time package dependency for automated UpdatedAt/CreatedAt. + _ = time.Second + // Force qmhelper dependency for where clause generation (which doesn't + // always happen) + _ = qmhelper.Where +) + +var textNoteAfterSelectMu sync.Mutex +var textNoteAfterSelectHooks []TextNoteHook + +var textNoteBeforeInsertMu sync.Mutex +var textNoteBeforeInsertHooks []TextNoteHook +var textNoteAfterInsertMu sync.Mutex +var textNoteAfterInsertHooks []TextNoteHook + +var textNoteBeforeUpdateMu sync.Mutex +var textNoteBeforeUpdateHooks []TextNoteHook +var textNoteAfterUpdateMu sync.Mutex +var textNoteAfterUpdateHooks []TextNoteHook + +var textNoteBeforeDeleteMu sync.Mutex +var textNoteBeforeDeleteHooks []TextNoteHook +var textNoteAfterDeleteMu sync.Mutex +var textNoteAfterDeleteHooks []TextNoteHook + +var textNoteBeforeUpsertMu sync.Mutex +var textNoteBeforeUpsertHooks []TextNoteHook +var textNoteAfterUpsertMu sync.Mutex +var textNoteAfterUpsertHooks []TextNoteHook + +// doAfterSelectHooks executes all "after Select" hooks. +func (o *TextNote) doAfterSelectHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteAfterSelectHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeInsertHooks executes all "before insert" hooks. +func (o *TextNote) doBeforeInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteBeforeInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterInsertHooks executes all "after Insert" hooks. +func (o *TextNote) doAfterInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteAfterInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpdateHooks executes all "before Update" hooks. +func (o *TextNote) doBeforeUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteBeforeUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpdateHooks executes all "after Update" hooks. +func (o *TextNote) doAfterUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteAfterUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeDeleteHooks executes all "before Delete" hooks. +func (o *TextNote) doBeforeDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteBeforeDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterDeleteHooks executes all "after Delete" hooks. +func (o *TextNote) doAfterDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteAfterDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpsertHooks executes all "before Upsert" hooks. +func (o *TextNote) doBeforeUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteBeforeUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpsertHooks executes all "after Upsert" hooks. +func (o *TextNote) doAfterUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range textNoteAfterUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// AddTextNoteHook registers your hook function for all future operations. +func AddTextNoteHook(hookPoint boil.HookPoint, textNoteHook TextNoteHook) { + switch hookPoint { + case boil.AfterSelectHook: + textNoteAfterSelectMu.Lock() + textNoteAfterSelectHooks = append(textNoteAfterSelectHooks, textNoteHook) + textNoteAfterSelectMu.Unlock() + case boil.BeforeInsertHook: + textNoteBeforeInsertMu.Lock() + textNoteBeforeInsertHooks = append(textNoteBeforeInsertHooks, textNoteHook) + textNoteBeforeInsertMu.Unlock() + case boil.AfterInsertHook: + textNoteAfterInsertMu.Lock() + textNoteAfterInsertHooks = append(textNoteAfterInsertHooks, textNoteHook) + textNoteAfterInsertMu.Unlock() + case boil.BeforeUpdateHook: + textNoteBeforeUpdateMu.Lock() + textNoteBeforeUpdateHooks = append(textNoteBeforeUpdateHooks, textNoteHook) + textNoteBeforeUpdateMu.Unlock() + case boil.AfterUpdateHook: + textNoteAfterUpdateMu.Lock() + textNoteAfterUpdateHooks = append(textNoteAfterUpdateHooks, textNoteHook) + textNoteAfterUpdateMu.Unlock() + case boil.BeforeDeleteHook: + textNoteBeforeDeleteMu.Lock() + textNoteBeforeDeleteHooks = append(textNoteBeforeDeleteHooks, textNoteHook) + textNoteBeforeDeleteMu.Unlock() + case boil.AfterDeleteHook: + textNoteAfterDeleteMu.Lock() + textNoteAfterDeleteHooks = append(textNoteAfterDeleteHooks, textNoteHook) + textNoteAfterDeleteMu.Unlock() + case boil.BeforeUpsertHook: + textNoteBeforeUpsertMu.Lock() + textNoteBeforeUpsertHooks = append(textNoteBeforeUpsertHooks, textNoteHook) + textNoteBeforeUpsertMu.Unlock() + case boil.AfterUpsertHook: + textNoteAfterUpsertMu.Lock() + textNoteAfterUpsertHooks = append(textNoteAfterUpsertHooks, textNoteHook) + textNoteAfterUpsertMu.Unlock() + } +} + +// OneG returns a single textNote record from the query using the global executor. +func (q textNoteQuery) OneG(ctx context.Context) (*TextNote, error) { + return q.One(ctx, boil.GetContextDB()) +} + +// One returns a single textNote record from the query. +func (q textNoteQuery) One(ctx context.Context, exec boil.ContextExecutor) (*TextNote, error) { + o := &TextNote{} + + queries.SetLimit(q.Query, 1) + + err := q.Bind(ctx, exec, o) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: failed to execute a one query for text_notes") + } + + if err := o.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + + return o, nil +} + +// AllG returns all TextNote records from the query using the global executor. +func (q textNoteQuery) AllG(ctx context.Context) (TextNoteSlice, error) { + return q.All(ctx, boil.GetContextDB()) +} + +// All returns all TextNote records from the query. +func (q textNoteQuery) All(ctx context.Context, exec boil.ContextExecutor) (TextNoteSlice, error) { + var o []*TextNote + + err := q.Bind(ctx, exec, &o) + if err != nil { + return nil, errors.Wrap(err, "models: failed to assign all query results to TextNote slice") + } + + if len(textNoteAfterSelectHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + } + } + + return o, nil +} + +// CountG returns the count of all TextNote records in the query using the global executor +func (q textNoteQuery) CountG(ctx context.Context) (int64, error) { + return q.Count(ctx, boil.GetContextDB()) +} + +// Count returns the count of all TextNote records in the query. +func (q textNoteQuery) Count(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return 0, errors.Wrap(err, "models: failed to count text_notes rows") + } + + return count, nil +} + +// ExistsG checks if the row exists in the table using the global executor. +func (q textNoteQuery) ExistsG(ctx context.Context) (bool, error) { + return q.Exists(ctx, boil.GetContextDB()) +} + +// Exists checks if the row exists in the table. +func (q textNoteQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + queries.SetLimit(q.Query, 1) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return false, errors.Wrap(err, "models: failed to check if text_notes exists") + } + + return count > 0, nil +} + +// UsersMetadatapubKeyUsersMetadatum pointed to by the foreign key. +func (o *TextNote) UsersMetadatapubKeyUsersMetadatum(mods ...qm.QueryMod) usersMetadatumQuery { + queryMods := []qm.QueryMod{ + qm.Where("\"pub_key\" = ?", o.UsersMetadatapubKey), + } + + queryMods = append(queryMods, mods...) + + return UsersMetadata(queryMods...) +} + +// TextNotesidReactions retrieves all the reaction's Reactions with an executor via text_notesid column. +func (o *TextNote) TextNotesidReactions(mods ...qm.QueryMod) reactionQuery { + var queryMods []qm.QueryMod + if len(mods) != 0 { + queryMods = append(queryMods, mods...) + } + + queryMods = append(queryMods, + qm.Where("\"reactions\".\"text_notesid\"=?", o.ID), + ) + + return Reactions(queryMods...) +} + +// LoadUsersMetadatapubKeyUsersMetadatum allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for an N-1 relationship. +func (textNoteL) LoadUsersMetadatapubKeyUsersMetadatum(ctx context.Context, e boil.ContextExecutor, singular bool, maybeTextNote interface{}, mods queries.Applicator) error { + var slice []*TextNote + var object *TextNote + + if singular { + var ok bool + object, ok = maybeTextNote.(*TextNote) + if !ok { + object = new(TextNote) + ok = queries.SetFromEmbeddedStruct(&object, &maybeTextNote) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeTextNote)) + } + } + } else { + s, ok := maybeTextNote.(*[]*TextNote) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeTextNote) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeTextNote)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &textNoteR{} + } + if !queries.IsNil(object.UsersMetadatapubKey) { + args[object.UsersMetadatapubKey] = struct{}{} + } + + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &textNoteR{} + } + + if !queries.IsNil(obj.UsersMetadatapubKey) { + args[obj.UsersMetadatapubKey] = struct{}{} + } + + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`users_metadata`), + qm.WhereIn(`users_metadata.pub_key in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load UsersMetadatum") + } + + var resultSlice []*UsersMetadatum + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice UsersMetadatum") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results of eager load for users_metadata") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for users_metadata") + } + + if len(usersMetadatumAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + + if len(resultSlice) == 0 { + return nil + } + + if singular { + foreign := resultSlice[0] + object.R.UsersMetadatapubKeyUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.UsersMetadatapubKeyTextNotes = append(foreign.R.UsersMetadatapubKeyTextNotes, object) + return nil + } + + for _, local := range slice { + for _, foreign := range resultSlice { + if queries.Equal(local.UsersMetadatapubKey, foreign.PubKey) { + local.R.UsersMetadatapubKeyUsersMetadatum = foreign + if foreign.R == nil { + foreign.R = &usersMetadatumR{} + } + foreign.R.UsersMetadatapubKeyTextNotes = append(foreign.R.UsersMetadatapubKeyTextNotes, local) + break + } + } + } + + return nil +} + +// LoadTextNotesidReactions allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for a 1-M or N-M relationship. +func (textNoteL) LoadTextNotesidReactions(ctx context.Context, e boil.ContextExecutor, singular bool, maybeTextNote interface{}, mods queries.Applicator) error { + var slice []*TextNote + var object *TextNote + + if singular { + var ok bool + object, ok = maybeTextNote.(*TextNote) + if !ok { + object = new(TextNote) + ok = queries.SetFromEmbeddedStruct(&object, &maybeTextNote) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeTextNote)) + } + } + } else { + s, ok := maybeTextNote.(*[]*TextNote) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeTextNote) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeTextNote)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &textNoteR{} + } + args[object.ID] = struct{}{} + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &textNoteR{} + } + args[obj.ID] = struct{}{} + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`reactions`), + qm.WhereIn(`reactions.text_notesid in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load reactions") + } + + var resultSlice []*Reaction + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice reactions") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results in eager load on reactions") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for reactions") + } + + if len(reactionAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + if singular { + object.R.TextNotesidReactions = resultSlice + for _, foreign := range resultSlice { + if foreign.R == nil { + foreign.R = &reactionR{} + } + foreign.R.TextNotesidTextNote = object + } + return nil + } + + for _, foreign := range resultSlice { + for _, local := range slice { + if queries.Equal(local.ID, foreign.TextNotesid) { + local.R.TextNotesidReactions = append(local.R.TextNotesidReactions, foreign) + if foreign.R == nil { + foreign.R = &reactionR{} + } + foreign.R.TextNotesidTextNote = local + break + } + } + } + + return nil +} + +// SetUsersMetadatapubKeyUsersMetadatumG of the textNote to the related item. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. +// Adds o to related.R.UsersMetadatapubKeyTextNotes. +// Uses the global database handle. +func (o *TextNote) SetUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, insert bool, related *UsersMetadatum) error { + return o.SetUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), insert, related) +} + +// SetUsersMetadatapubKeyUsersMetadatum of the textNote to the related item. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to related. +// Adds o to related.R.UsersMetadatapubKeyTextNotes. +func (o *TextNote) SetUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, insert bool, related *UsersMetadatum) error { + var err error + if insert { + if err = related.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } + + updateQuery := fmt.Sprintf( + "UPDATE \"text_notes\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), + strmangle.WhereClause("\"", "\"", 2, textNotePrimaryKeyColumns), + ) + values := []interface{}{related.PubKey, o.ID} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + queries.Assign(&o.UsersMetadatapubKey, related.PubKey) + if o.R == nil { + o.R = &textNoteR{ + UsersMetadatapubKeyUsersMetadatum: related, + } + } else { + o.R.UsersMetadatapubKeyUsersMetadatum = related + } + + if related.R == nil { + related.R = &usersMetadatumR{ + UsersMetadatapubKeyTextNotes: TextNoteSlice{o}, + } + } else { + related.R.UsersMetadatapubKeyTextNotes = append(related.R.UsersMetadatapubKeyTextNotes, o) + } + + return nil +} + +// RemoveUsersMetadatapubKeyUsersMetadatumG relationship. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. +// Removes o from all passed in related items' relationships struct. +// Uses the global database handle. +func (o *TextNote) RemoveUsersMetadatapubKeyUsersMetadatumG(ctx context.Context, related *UsersMetadatum) error { + return o.RemoveUsersMetadatapubKeyUsersMetadatum(ctx, boil.GetContextDB(), related) +} + +// RemoveUsersMetadatapubKeyUsersMetadatum relationship. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum to nil. +// Removes o from all passed in related items' relationships struct. +func (o *TextNote) RemoveUsersMetadatapubKeyUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, related *UsersMetadatum) error { + var err error + + queries.SetScanner(&o.UsersMetadatapubKey, nil) + if _, err = o.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { + return errors.Wrap(err, "failed to update local table") + } + + if o.R != nil { + o.R.UsersMetadatapubKeyUsersMetadatum = nil + } + if related == nil || related.R == nil { + return nil + } + + for i, ri := range related.R.UsersMetadatapubKeyTextNotes { + if queries.Equal(o.UsersMetadatapubKey, ri.UsersMetadatapubKey) { + continue + } + + ln := len(related.R.UsersMetadatapubKeyTextNotes) + if ln > 1 && i < ln-1 { + related.R.UsersMetadatapubKeyTextNotes[i] = related.R.UsersMetadatapubKeyTextNotes[ln-1] + } + related.R.UsersMetadatapubKeyTextNotes = related.R.UsersMetadatapubKeyTextNotes[:ln-1] + break + } + return nil +} + +// AddTextNotesidReactionsG adds the given related objects to the existing relationships +// of the text_note, optionally inserting them as new records. +// Appends related to o.R.TextNotesidReactions. +// Sets related.R.TextNotesidTextNote appropriately. +// Uses the global database handle. +func (o *TextNote) AddTextNotesidReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { + return o.AddTextNotesidReactions(ctx, boil.GetContextDB(), insert, related...) +} + +// AddTextNotesidReactions adds the given related objects to the existing relationships +// of the text_note, optionally inserting them as new records. +// Appends related to o.R.TextNotesidReactions. +// Sets related.R.TextNotesidTextNote appropriately. +func (o *TextNote) AddTextNotesidReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { + var err error + for _, rel := range related { + if insert { + queries.Assign(&rel.TextNotesid, o.ID) + if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } else { + updateQuery := fmt.Sprintf( + "UPDATE \"reactions\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"text_notesid"}), + strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), + ) + values := []interface{}{o.ID, rel.ID} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update foreign table") + } + + queries.Assign(&rel.TextNotesid, o.ID) + } + } + + if o.R == nil { + o.R = &textNoteR{ + TextNotesidReactions: related, + } + } else { + o.R.TextNotesidReactions = append(o.R.TextNotesidReactions, related...) + } + + for _, rel := range related { + if rel.R == nil { + rel.R = &reactionR{ + TextNotesidTextNote: o, + } + } else { + rel.R.TextNotesidTextNote = o + } + } + return nil +} + +// SetTextNotesidReactionsG removes all previously related items of the +// text_note replacing them completely with the passed +// in related items, optionally inserting them as new records. +// Sets o.R.TextNotesidTextNote's TextNotesidReactions accordingly. +// Replaces o.R.TextNotesidReactions with related. +// Sets related.R.TextNotesidTextNote's TextNotesidReactions accordingly. +// Uses the global database handle. +func (o *TextNote) SetTextNotesidReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { + return o.SetTextNotesidReactions(ctx, boil.GetContextDB(), insert, related...) +} + +// SetTextNotesidReactions removes all previously related items of the +// text_note replacing them completely with the passed +// in related items, optionally inserting them as new records. +// Sets o.R.TextNotesidTextNote's TextNotesidReactions accordingly. +// Replaces o.R.TextNotesidReactions with related. +// Sets related.R.TextNotesidTextNote's TextNotesidReactions accordingly. +func (o *TextNote) SetTextNotesidReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { + query := "update \"reactions\" set \"text_notesid\" = null where \"text_notesid\" = $1" + values := []interface{}{o.ID} + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, query) + fmt.Fprintln(writer, values) + } + _, err := exec.ExecContext(ctx, query, values...) + if err != nil { + return errors.Wrap(err, "failed to remove relationships before set") + } + + if o.R != nil { + for _, rel := range o.R.TextNotesidReactions { + queries.SetScanner(&rel.TextNotesid, nil) + if rel.R == nil { + continue + } + + rel.R.TextNotesidTextNote = nil + } + o.R.TextNotesidReactions = nil + } + + return o.AddTextNotesidReactions(ctx, exec, insert, related...) +} + +// RemoveTextNotesidReactionsG relationships from objects passed in. +// Removes related items from R.TextNotesidReactions (uses pointer comparison, removal does not keep order) +// Sets related.R.TextNotesidTextNote. +// Uses the global database handle. +func (o *TextNote) RemoveTextNotesidReactionsG(ctx context.Context, related ...*Reaction) error { + return o.RemoveTextNotesidReactions(ctx, boil.GetContextDB(), related...) +} + +// RemoveTextNotesidReactions relationships from objects passed in. +// Removes related items from R.TextNotesidReactions (uses pointer comparison, removal does not keep order) +// Sets related.R.TextNotesidTextNote. +func (o *TextNote) RemoveTextNotesidReactions(ctx context.Context, exec boil.ContextExecutor, related ...*Reaction) error { + if len(related) == 0 { + return nil + } + + var err error + for _, rel := range related { + queries.SetScanner(&rel.TextNotesid, nil) + if rel.R != nil { + rel.R.TextNotesidTextNote = nil + } + if _, err = rel.Update(ctx, exec, boil.Whitelist("text_notesid")); err != nil { + return err + } + } + if o.R == nil { + return nil + } + + for _, rel := range related { + for i, ri := range o.R.TextNotesidReactions { + if rel != ri { + continue + } + + ln := len(o.R.TextNotesidReactions) + if ln > 1 && i < ln-1 { + o.R.TextNotesidReactions[i] = o.R.TextNotesidReactions[ln-1] + } + o.R.TextNotesidReactions = o.R.TextNotesidReactions[:ln-1] + break + } + } + + return nil +} + +// TextNotes retrieves all the records using an executor. +func TextNotes(mods ...qm.QueryMod) textNoteQuery { + mods = append(mods, qm.From("\"text_notes\"")) + q := NewQuery(mods...) + if len(queries.GetSelect(q)) == 0 { + queries.SetSelect(q, []string{"\"text_notes\".*"}) + } + + return textNoteQuery{q} +} + +// FindTextNoteG retrieves a single record by ID. +func FindTextNoteG(ctx context.Context, iD string, selectCols ...string) (*TextNote, error) { + return FindTextNote(ctx, boil.GetContextDB(), iD, selectCols...) +} + +// FindTextNote retrieves a single record by ID with an executor. +// If selectCols is empty Find will return all columns. +func FindTextNote(ctx context.Context, exec boil.ContextExecutor, iD string, selectCols ...string) (*TextNote, error) { + textNoteObj := &TextNote{} + + sel := "*" + if len(selectCols) > 0 { + sel = strings.Join(strmangle.IdentQuoteSlice(dialect.LQ, dialect.RQ, selectCols), ",") + } + query := fmt.Sprintf( + "select %s from \"text_notes\" where \"id\"=$1", sel, + ) + + q := queries.Raw(query, iD) + + err := q.Bind(ctx, exec, textNoteObj) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: unable to select from text_notes") + } + + if err = textNoteObj.doAfterSelectHooks(ctx, exec); err != nil { + return textNoteObj, err + } + + return textNoteObj, nil +} + +// InsertG a single record. See Insert for whitelist behavior description. +func (o *TextNote) InsertG(ctx context.Context, columns boil.Columns) error { + return o.Insert(ctx, boil.GetContextDB(), columns) +} + +// Insert a single record using an executor. +// See boil.Columns.InsertColumnSet documentation to understand column list inference for inserts. +func (o *TextNote) Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error { + if o == nil { + return errors.New("models: no text_notes provided for insertion") + } + + var err error + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + if o.UpdatedAt.IsZero() { + o.UpdatedAt = currTime + } + } + + if err := o.doBeforeInsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(textNoteColumnsWithDefault, o) + + key := makeCacheKey(columns, nzDefaults) + textNoteInsertCacheMut.RLock() + cache, cached := textNoteInsertCache[key] + textNoteInsertCacheMut.RUnlock() + + if !cached { + wl, returnColumns := columns.InsertColumnSet( + textNoteAllColumns, + textNoteColumnsWithDefault, + textNoteColumnsWithoutDefault, + nzDefaults, + ) + + cache.valueMapping, err = queries.BindMapping(textNoteType, textNoteMapping, wl) + if err != nil { + return err + } + cache.retMapping, err = queries.BindMapping(textNoteType, textNoteMapping, returnColumns) + if err != nil { + return err + } + if len(wl) != 0 { + cache.query = fmt.Sprintf("INSERT INTO \"text_notes\" (\"%s\") %%sVALUES (%s)%%s", strings.Join(wl, "\",\""), strmangle.Placeholders(dialect.UseIndexPlaceholders, len(wl), 1, 1)) + } else { + cache.query = "INSERT INTO \"text_notes\" %sDEFAULT VALUES%s" + } + + var queryOutput, queryReturning string + + if len(cache.retMapping) != 0 { + queryReturning = fmt.Sprintf(" RETURNING \"%s\"", strings.Join(returnColumns, "\",\"")) + } + + cache.query = fmt.Sprintf(cache.query, queryOutput, queryReturning) + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(queries.PtrsFromMapping(value, cache.retMapping)...) + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + + if err != nil { + return errors.Wrap(err, "models: unable to insert into text_notes") + } + + if !cached { + textNoteInsertCacheMut.Lock() + textNoteInsertCache[key] = cache + textNoteInsertCacheMut.Unlock() + } + + return o.doAfterInsertHooks(ctx, exec) +} + +// UpdateG a single TextNote record using the global executor. +// See Update for more documentation. +func (o *TextNote) UpdateG(ctx context.Context, columns boil.Columns) (int64, error) { + return o.Update(ctx, boil.GetContextDB(), columns) +} + +// Update uses an executor to update the TextNote. +// See boil.Columns.UpdateColumnSet documentation to understand column list inference for updates. +// Update does not automatically update the record in case of default values. Use .Reload() to refresh the records. +func (o *TextNote) Update(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) (int64, error) { + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + o.UpdatedAt = currTime + } + + var err error + if err = o.doBeforeUpdateHooks(ctx, exec); err != nil { + return 0, err + } + key := makeCacheKey(columns, nil) + textNoteUpdateCacheMut.RLock() + cache, cached := textNoteUpdateCache[key] + textNoteUpdateCacheMut.RUnlock() + + if !cached { + wl := columns.UpdateColumnSet( + textNoteAllColumns, + textNotePrimaryKeyColumns, + ) + + if !columns.IsWhitelist() { + wl = strmangle.SetComplement(wl, []string{"created_at"}) + } + if len(wl) == 0 { + return 0, errors.New("models: unable to update text_notes, could not build whitelist") + } + + cache.query = fmt.Sprintf("UPDATE \"text_notes\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, wl), + strmangle.WhereClause("\"", "\"", len(wl)+1, textNotePrimaryKeyColumns), + ) + cache.valueMapping, err = queries.BindMapping(textNoteType, textNoteMapping, append(wl, textNotePrimaryKeyColumns...)) + if err != nil { + return 0, err + } + } + + values := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, values) + } + var result sql.Result + result, err = exec.ExecContext(ctx, cache.query, values...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update text_notes row") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by update for text_notes") + } + + if !cached { + textNoteUpdateCacheMut.Lock() + textNoteUpdateCache[key] = cache + textNoteUpdateCacheMut.Unlock() + } + + return rowsAff, o.doAfterUpdateHooks(ctx, exec) +} + +// UpdateAllG updates all rows with the specified column values. +func (q textNoteQuery) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return q.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values. +func (q textNoteQuery) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + queries.SetUpdate(q.Query, cols) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all for text_notes") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected for text_notes") + } + + return rowsAff, nil +} + +// UpdateAllG updates all rows with the specified column values. +func (o TextNoteSlice) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return o.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values, using an executor. +func (o TextNoteSlice) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + ln := int64(len(o)) + if ln == 0 { + return 0, nil + } + + if len(cols) == 0 { + return 0, errors.New("models: update all requires at least one column argument") + } + + colNames := make([]string, len(cols)) + args := make([]interface{}, len(cols)) + + i := 0 + for name, value := range cols { + colNames[i] = name + args[i] = value + i++ + } + + // Append all of the primary key values for each column + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), textNotePrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := fmt.Sprintf("UPDATE \"text_notes\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, colNames), + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), len(colNames)+1, textNotePrimaryKeyColumns, len(o))) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all in textNote slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected all in update all textNote") + } + return rowsAff, nil +} + +// UpsertG attempts an insert, and does an update or ignore on conflict. +func (o *TextNote) UpsertG(ctx context.Context, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + return o.Upsert(ctx, boil.GetContextDB(), updateOnConflict, conflictColumns, updateColumns, insertColumns, opts...) +} + +// Upsert attempts an insert using an executor, and does an update or ignore on conflict. +// See boil.Columns documentation for how to properly use updateColumns and insertColumns. +func (o *TextNote) Upsert(ctx context.Context, exec boil.ContextExecutor, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + if o == nil { + return errors.New("models: no text_notes provided for upsert") + } + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + o.UpdatedAt = currTime + } + + if err := o.doBeforeUpsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(textNoteColumnsWithDefault, o) + + // Build cache key in-line uglily - mysql vs psql problems + buf := strmangle.GetBuffer() + if updateOnConflict { + buf.WriteByte('t') + } else { + buf.WriteByte('f') + } + buf.WriteByte('.') + for _, c := range conflictColumns { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(updateColumns.Kind)) + for _, c := range updateColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(insertColumns.Kind)) + for _, c := range insertColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + for _, c := range nzDefaults { + buf.WriteString(c) + } + key := buf.String() + strmangle.PutBuffer(buf) + + textNoteUpsertCacheMut.RLock() + cache, cached := textNoteUpsertCache[key] + textNoteUpsertCacheMut.RUnlock() + + var err error + + if !cached { + insert, _ := insertColumns.InsertColumnSet( + textNoteAllColumns, + textNoteColumnsWithDefault, + textNoteColumnsWithoutDefault, + nzDefaults, + ) + + update := updateColumns.UpdateColumnSet( + textNoteAllColumns, + textNotePrimaryKeyColumns, + ) + + if updateOnConflict && len(update) == 0 { + return errors.New("models: unable to upsert text_notes, could not build update column list") + } + + ret := strmangle.SetComplement(textNoteAllColumns, strmangle.SetIntersect(insert, update)) + + conflict := conflictColumns + if len(conflict) == 0 && updateOnConflict && len(update) != 0 { + if len(textNotePrimaryKeyColumns) == 0 { + return errors.New("models: unable to upsert text_notes, could not build conflict column list") + } + + conflict = make([]string, len(textNotePrimaryKeyColumns)) + copy(conflict, textNotePrimaryKeyColumns) + } + cache.query = buildUpsertQueryPostgres(dialect, "\"text_notes\"", updateOnConflict, ret, update, conflict, insert, opts...) + + cache.valueMapping, err = queries.BindMapping(textNoteType, textNoteMapping, insert) + if err != nil { + return err + } + if len(ret) != 0 { + cache.retMapping, err = queries.BindMapping(textNoteType, textNoteMapping, ret) + if err != nil { + return err + } + } + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + var returns []interface{} + if len(cache.retMapping) != 0 { + returns = queries.PtrsFromMapping(value, cache.retMapping) + } + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(returns...) + if errors.Is(err, sql.ErrNoRows) { + err = nil // Postgres doesn't return anything when there's no update + } + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + if err != nil { + return errors.Wrap(err, "models: unable to upsert text_notes") + } + + if !cached { + textNoteUpsertCacheMut.Lock() + textNoteUpsertCache[key] = cache + textNoteUpsertCacheMut.Unlock() + } + + return o.doAfterUpsertHooks(ctx, exec) +} + +// DeleteG deletes a single TextNote record. +// DeleteG will match against the primary key column to find the record to delete. +func (o *TextNote) DeleteG(ctx context.Context) (int64, error) { + return o.Delete(ctx, boil.GetContextDB()) +} + +// Delete deletes a single TextNote record with an executor. +// Delete will match against the primary key column to find the record to delete. +func (o *TextNote) Delete(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if o == nil { + return 0, errors.New("models: no TextNote provided for delete") + } + + if err := o.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + args := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), textNotePrimaryKeyMapping) + sql := "DELETE FROM \"text_notes\" WHERE \"id\"=$1" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete from text_notes") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by delete for text_notes") + } + + if err := o.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + return rowsAff, nil +} + +func (q textNoteQuery) DeleteAllG(ctx context.Context) (int64, error) { + return q.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all matching rows. +func (q textNoteQuery) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if q.Query == nil { + return 0, errors.New("models: no textNoteQuery provided for delete all") + } + + queries.SetDelete(q.Query) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from text_notes") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for text_notes") + } + + return rowsAff, nil +} + +// DeleteAllG deletes all rows in the slice. +func (o TextNoteSlice) DeleteAllG(ctx context.Context) (int64, error) { + return o.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all rows in the slice, using an executor. +func (o TextNoteSlice) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if len(o) == 0 { + return 0, nil + } + + if len(textNoteBeforeDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + var args []interface{} + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), textNotePrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "DELETE FROM \"text_notes\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, textNotePrimaryKeyColumns, len(o)) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from textNote slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for text_notes") + } + + if len(textNoteAfterDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + return rowsAff, nil +} + +// ReloadG refetches the object from the database using the primary keys. +func (o *TextNote) ReloadG(ctx context.Context) error { + if o == nil { + return errors.New("models: no TextNote provided for reload") + } + + return o.Reload(ctx, boil.GetContextDB()) +} + +// Reload refetches the object from the database +// using the primary keys with an executor. +func (o *TextNote) Reload(ctx context.Context, exec boil.ContextExecutor) error { + ret, err := FindTextNote(ctx, exec, o.ID) + if err != nil { + return err + } + + *o = *ret + return nil +} + +// ReloadAllG refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *TextNoteSlice) ReloadAllG(ctx context.Context) error { + if o == nil { + return errors.New("models: empty TextNoteSlice provided for reload all") + } + + return o.ReloadAll(ctx, boil.GetContextDB()) +} + +// ReloadAll refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *TextNoteSlice) ReloadAll(ctx context.Context, exec boil.ContextExecutor) error { + if o == nil || len(*o) == 0 { + return nil + } + + slice := TextNoteSlice{} + var args []interface{} + for _, obj := range *o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), textNotePrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "SELECT \"text_notes\".* FROM \"text_notes\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, textNotePrimaryKeyColumns, len(*o)) + + q := queries.Raw(sql, args...) + + err := q.Bind(ctx, exec, &slice) + if err != nil { + return errors.Wrap(err, "models: unable to reload all in TextNoteSlice") + } + + *o = slice + + return nil +} + +// TextNoteExistsG checks if the TextNote row exists. +func TextNoteExistsG(ctx context.Context, iD string) (bool, error) { + return TextNoteExists(ctx, boil.GetContextDB(), iD) +} + +// TextNoteExists checks if the TextNote row exists. +func TextNoteExists(ctx context.Context, exec boil.ContextExecutor, iD string) (bool, error) { + var exists bool + sql := "select exists(select 1 from \"text_notes\" where \"id\"=$1 limit 1)" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, iD) + } + row := exec.QueryRowContext(ctx, sql, iD) + + err := row.Scan(&exists) + if err != nil { + return false, errors.Wrap(err, "models: unable to check if text_notes exists") + } + + return exists, nil +} + +// Exists checks if the TextNote row exists. +func (o *TextNote) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + return TextNoteExists(ctx, exec, o.ID) +} diff --git a/models/users_metadata.go b/models/users_metadata.go new file mode 100644 index 0000000..5a4472e --- /dev/null +++ b/models/users_metadata.go @@ -0,0 +1,2078 @@ +// Code generated by SQLBoiler 4.16.2 (https://github.com/volatiletech/sqlboiler). DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package models + +import ( + "context" + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/friendsofgo/errors" + "github.com/volatiletech/null/v8" + "github.com/volatiletech/sqlboiler/v4/boil" + "github.com/volatiletech/sqlboiler/v4/queries" + "github.com/volatiletech/sqlboiler/v4/queries/qm" + "github.com/volatiletech/sqlboiler/v4/queries/qmhelper" + "github.com/volatiletech/strmangle" +) + +// UsersMetadatum is an object representing the database table. +type UsersMetadatum struct { + PubKey string `boil:"pub_key" json:"pub_key" toml:"pub_key" yaml:"pub_key"` + CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"` + UpdatedAt time.Time `boil:"updated_at" json:"updated_at" toml:"updated_at" yaml:"updated_at"` + DeletedAt null.Time `boil:"deleted_at" json:"deleted_at,omitempty" toml:"deleted_at" yaml:"deleted_at,omitempty"` + Content null.String `boil:"content" json:"content,omitempty" toml:"content" yaml:"content,omitempty"` + FollowListEvent null.JSON `boil:"follow_list_event" json:"follow_list_event,omitempty" toml:"follow_list_event" yaml:"follow_list_event,omitempty"` + + R *usersMetadatumR `boil:"-" json:"-" toml:"-" yaml:"-"` + L usersMetadatumL `boil:"-" json:"-" toml:"-" yaml:"-"` +} + +var UsersMetadatumColumns = struct { + PubKey string + CreatedAt string + UpdatedAt string + DeletedAt string + Content string + FollowListEvent string +}{ + PubKey: "pub_key", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Content: "content", + FollowListEvent: "follow_list_event", +} + +var UsersMetadatumTableColumns = struct { + PubKey string + CreatedAt string + UpdatedAt string + DeletedAt string + Content string + FollowListEvent string +}{ + PubKey: "users_metadata.pub_key", + CreatedAt: "users_metadata.created_at", + UpdatedAt: "users_metadata.updated_at", + DeletedAt: "users_metadata.deleted_at", + Content: "users_metadata.content", + FollowListEvent: "users_metadata.follow_list_event", +} + +// Generated where + +type whereHelpernull_JSON struct{ field string } + +func (w whereHelpernull_JSON) EQ(x null.JSON) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, false, x) +} +func (w whereHelpernull_JSON) NEQ(x null.JSON) qm.QueryMod { + return qmhelper.WhereNullEQ(w.field, true, x) +} +func (w whereHelpernull_JSON) LT(x null.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LT, x) +} +func (w whereHelpernull_JSON) LTE(x null.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.LTE, x) +} +func (w whereHelpernull_JSON) GT(x null.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GT, x) +} +func (w whereHelpernull_JSON) GTE(x null.JSON) qm.QueryMod { + return qmhelper.Where(w.field, qmhelper.GTE, x) +} + +func (w whereHelpernull_JSON) IsNull() qm.QueryMod { return qmhelper.WhereIsNull(w.field) } +func (w whereHelpernull_JSON) IsNotNull() qm.QueryMod { return qmhelper.WhereIsNotNull(w.field) } + +var UsersMetadatumWhere = struct { + PubKey whereHelperstring + CreatedAt whereHelpertime_Time + UpdatedAt whereHelpertime_Time + DeletedAt whereHelpernull_Time + Content whereHelpernull_String + FollowListEvent whereHelpernull_JSON +}{ + PubKey: whereHelperstring{field: "\"users_metadata\".\"pub_key\""}, + CreatedAt: whereHelpertime_Time{field: "\"users_metadata\".\"created_at\""}, + UpdatedAt: whereHelpertime_Time{field: "\"users_metadata\".\"updated_at\""}, + DeletedAt: whereHelpernull_Time{field: "\"users_metadata\".\"deleted_at\""}, + Content: whereHelpernull_String{field: "\"users_metadata\".\"content\""}, + FollowListEvent: whereHelpernull_JSON{field: "\"users_metadata\".\"follow_list_event\""}, +} + +// UsersMetadatumRels is where relationship names are stored. +var UsersMetadatumRels = struct { + FollowerFollowLists string + FollowingFollowLists string + UsersMetadatapubKeyReactions string + UsersMetadatapubKeyTextNotes string +}{ + FollowerFollowLists: "FollowerFollowLists", + FollowingFollowLists: "FollowingFollowLists", + UsersMetadatapubKeyReactions: "UsersMetadatapubKeyReactions", + UsersMetadatapubKeyTextNotes: "UsersMetadatapubKeyTextNotes", +} + +// usersMetadatumR is where relationships are stored. +type usersMetadatumR struct { + FollowerFollowLists FollowListSlice `boil:"FollowerFollowLists" json:"FollowerFollowLists" toml:"FollowerFollowLists" yaml:"FollowerFollowLists"` + FollowingFollowLists FollowListSlice `boil:"FollowingFollowLists" json:"FollowingFollowLists" toml:"FollowingFollowLists" yaml:"FollowingFollowLists"` + UsersMetadatapubKeyReactions ReactionSlice `boil:"UsersMetadatapubKeyReactions" json:"UsersMetadatapubKeyReactions" toml:"UsersMetadatapubKeyReactions" yaml:"UsersMetadatapubKeyReactions"` + UsersMetadatapubKeyTextNotes TextNoteSlice `boil:"UsersMetadatapubKeyTextNotes" json:"UsersMetadatapubKeyTextNotes" toml:"UsersMetadatapubKeyTextNotes" yaml:"UsersMetadatapubKeyTextNotes"` +} + +// NewStruct creates a new relationship struct +func (*usersMetadatumR) NewStruct() *usersMetadatumR { + return &usersMetadatumR{} +} + +func (r *usersMetadatumR) GetFollowerFollowLists() FollowListSlice { + if r == nil { + return nil + } + return r.FollowerFollowLists +} + +func (r *usersMetadatumR) GetFollowingFollowLists() FollowListSlice { + if r == nil { + return nil + } + return r.FollowingFollowLists +} + +func (r *usersMetadatumR) GetUsersMetadatapubKeyReactions() ReactionSlice { + if r == nil { + return nil + } + return r.UsersMetadatapubKeyReactions +} + +func (r *usersMetadatumR) GetUsersMetadatapubKeyTextNotes() TextNoteSlice { + if r == nil { + return nil + } + return r.UsersMetadatapubKeyTextNotes +} + +// usersMetadatumL is where Load methods for each relationship are stored. +type usersMetadatumL struct{} + +var ( + usersMetadatumAllColumns = []string{"pub_key", "created_at", "updated_at", "deleted_at", "content", "follow_list_event"} + usersMetadatumColumnsWithoutDefault = []string{"pub_key"} + usersMetadatumColumnsWithDefault = []string{"created_at", "updated_at", "deleted_at", "content", "follow_list_event"} + usersMetadatumPrimaryKeyColumns = []string{"pub_key"} + usersMetadatumGeneratedColumns = []string{} +) + +type ( + // UsersMetadatumSlice is an alias for a slice of pointers to UsersMetadatum. + // This should almost always be used instead of []UsersMetadatum. + UsersMetadatumSlice []*UsersMetadatum + // UsersMetadatumHook is the signature for custom UsersMetadatum hook methods + UsersMetadatumHook func(context.Context, boil.ContextExecutor, *UsersMetadatum) error + + usersMetadatumQuery struct { + *queries.Query + } +) + +// Cache for insert, update and upsert +var ( + usersMetadatumType = reflect.TypeOf(&UsersMetadatum{}) + usersMetadatumMapping = queries.MakeStructMapping(usersMetadatumType) + usersMetadatumPrimaryKeyMapping, _ = queries.BindMapping(usersMetadatumType, usersMetadatumMapping, usersMetadatumPrimaryKeyColumns) + usersMetadatumInsertCacheMut sync.RWMutex + usersMetadatumInsertCache = make(map[string]insertCache) + usersMetadatumUpdateCacheMut sync.RWMutex + usersMetadatumUpdateCache = make(map[string]updateCache) + usersMetadatumUpsertCacheMut sync.RWMutex + usersMetadatumUpsertCache = make(map[string]insertCache) +) + +var ( + // Force time package dependency for automated UpdatedAt/CreatedAt. + _ = time.Second + // Force qmhelper dependency for where clause generation (which doesn't + // always happen) + _ = qmhelper.Where +) + +var usersMetadatumAfterSelectMu sync.Mutex +var usersMetadatumAfterSelectHooks []UsersMetadatumHook + +var usersMetadatumBeforeInsertMu sync.Mutex +var usersMetadatumBeforeInsertHooks []UsersMetadatumHook +var usersMetadatumAfterInsertMu sync.Mutex +var usersMetadatumAfterInsertHooks []UsersMetadatumHook + +var usersMetadatumBeforeUpdateMu sync.Mutex +var usersMetadatumBeforeUpdateHooks []UsersMetadatumHook +var usersMetadatumAfterUpdateMu sync.Mutex +var usersMetadatumAfterUpdateHooks []UsersMetadatumHook + +var usersMetadatumBeforeDeleteMu sync.Mutex +var usersMetadatumBeforeDeleteHooks []UsersMetadatumHook +var usersMetadatumAfterDeleteMu sync.Mutex +var usersMetadatumAfterDeleteHooks []UsersMetadatumHook + +var usersMetadatumBeforeUpsertMu sync.Mutex +var usersMetadatumBeforeUpsertHooks []UsersMetadatumHook +var usersMetadatumAfterUpsertMu sync.Mutex +var usersMetadatumAfterUpsertHooks []UsersMetadatumHook + +// doAfterSelectHooks executes all "after Select" hooks. +func (o *UsersMetadatum) doAfterSelectHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumAfterSelectHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeInsertHooks executes all "before insert" hooks. +func (o *UsersMetadatum) doBeforeInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumBeforeInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterInsertHooks executes all "after Insert" hooks. +func (o *UsersMetadatum) doAfterInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumAfterInsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpdateHooks executes all "before Update" hooks. +func (o *UsersMetadatum) doBeforeUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumBeforeUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpdateHooks executes all "after Update" hooks. +func (o *UsersMetadatum) doAfterUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumAfterUpdateHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeDeleteHooks executes all "before Delete" hooks. +func (o *UsersMetadatum) doBeforeDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumBeforeDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterDeleteHooks executes all "after Delete" hooks. +func (o *UsersMetadatum) doAfterDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumAfterDeleteHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doBeforeUpsertHooks executes all "before Upsert" hooks. +func (o *UsersMetadatum) doBeforeUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumBeforeUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// doAfterUpsertHooks executes all "after Upsert" hooks. +func (o *UsersMetadatum) doAfterUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) { + if boil.HooksAreSkipped(ctx) { + return nil + } + + for _, hook := range usersMetadatumAfterUpsertHooks { + if err := hook(ctx, exec, o); err != nil { + return err + } + } + + return nil +} + +// AddUsersMetadatumHook registers your hook function for all future operations. +func AddUsersMetadatumHook(hookPoint boil.HookPoint, usersMetadatumHook UsersMetadatumHook) { + switch hookPoint { + case boil.AfterSelectHook: + usersMetadatumAfterSelectMu.Lock() + usersMetadatumAfterSelectHooks = append(usersMetadatumAfterSelectHooks, usersMetadatumHook) + usersMetadatumAfterSelectMu.Unlock() + case boil.BeforeInsertHook: + usersMetadatumBeforeInsertMu.Lock() + usersMetadatumBeforeInsertHooks = append(usersMetadatumBeforeInsertHooks, usersMetadatumHook) + usersMetadatumBeforeInsertMu.Unlock() + case boil.AfterInsertHook: + usersMetadatumAfterInsertMu.Lock() + usersMetadatumAfterInsertHooks = append(usersMetadatumAfterInsertHooks, usersMetadatumHook) + usersMetadatumAfterInsertMu.Unlock() + case boil.BeforeUpdateHook: + usersMetadatumBeforeUpdateMu.Lock() + usersMetadatumBeforeUpdateHooks = append(usersMetadatumBeforeUpdateHooks, usersMetadatumHook) + usersMetadatumBeforeUpdateMu.Unlock() + case boil.AfterUpdateHook: + usersMetadatumAfterUpdateMu.Lock() + usersMetadatumAfterUpdateHooks = append(usersMetadatumAfterUpdateHooks, usersMetadatumHook) + usersMetadatumAfterUpdateMu.Unlock() + case boil.BeforeDeleteHook: + usersMetadatumBeforeDeleteMu.Lock() + usersMetadatumBeforeDeleteHooks = append(usersMetadatumBeforeDeleteHooks, usersMetadatumHook) + usersMetadatumBeforeDeleteMu.Unlock() + case boil.AfterDeleteHook: + usersMetadatumAfterDeleteMu.Lock() + usersMetadatumAfterDeleteHooks = append(usersMetadatumAfterDeleteHooks, usersMetadatumHook) + usersMetadatumAfterDeleteMu.Unlock() + case boil.BeforeUpsertHook: + usersMetadatumBeforeUpsertMu.Lock() + usersMetadatumBeforeUpsertHooks = append(usersMetadatumBeforeUpsertHooks, usersMetadatumHook) + usersMetadatumBeforeUpsertMu.Unlock() + case boil.AfterUpsertHook: + usersMetadatumAfterUpsertMu.Lock() + usersMetadatumAfterUpsertHooks = append(usersMetadatumAfterUpsertHooks, usersMetadatumHook) + usersMetadatumAfterUpsertMu.Unlock() + } +} + +// OneG returns a single usersMetadatum record from the query using the global executor. +func (q usersMetadatumQuery) OneG(ctx context.Context) (*UsersMetadatum, error) { + return q.One(ctx, boil.GetContextDB()) +} + +// One returns a single usersMetadatum record from the query. +func (q usersMetadatumQuery) One(ctx context.Context, exec boil.ContextExecutor) (*UsersMetadatum, error) { + o := &UsersMetadatum{} + + queries.SetLimit(q.Query, 1) + + err := q.Bind(ctx, exec, o) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: failed to execute a one query for users_metadata") + } + + if err := o.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + + return o, nil +} + +// AllG returns all UsersMetadatum records from the query using the global executor. +func (q usersMetadatumQuery) AllG(ctx context.Context) (UsersMetadatumSlice, error) { + return q.All(ctx, boil.GetContextDB()) +} + +// All returns all UsersMetadatum records from the query. +func (q usersMetadatumQuery) All(ctx context.Context, exec boil.ContextExecutor) (UsersMetadatumSlice, error) { + var o []*UsersMetadatum + + err := q.Bind(ctx, exec, &o) + if err != nil { + return nil, errors.Wrap(err, "models: failed to assign all query results to UsersMetadatum slice") + } + + if len(usersMetadatumAfterSelectHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterSelectHooks(ctx, exec); err != nil { + return o, err + } + } + } + + return o, nil +} + +// CountG returns the count of all UsersMetadatum records in the query using the global executor +func (q usersMetadatumQuery) CountG(ctx context.Context) (int64, error) { + return q.Count(ctx, boil.GetContextDB()) +} + +// Count returns the count of all UsersMetadatum records in the query. +func (q usersMetadatumQuery) Count(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return 0, errors.Wrap(err, "models: failed to count users_metadata rows") + } + + return count, nil +} + +// ExistsG checks if the row exists in the table using the global executor. +func (q usersMetadatumQuery) ExistsG(ctx context.Context) (bool, error) { + return q.Exists(ctx, boil.GetContextDB()) +} + +// Exists checks if the row exists in the table. +func (q usersMetadatumQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + var count int64 + + queries.SetSelect(q.Query, nil) + queries.SetCount(q.Query) + queries.SetLimit(q.Query, 1) + + err := q.Query.QueryRowContext(ctx, exec).Scan(&count) + if err != nil { + return false, errors.Wrap(err, "models: failed to check if users_metadata exists") + } + + return count > 0, nil +} + +// FollowerFollowLists retrieves all the follow_list's FollowLists with an executor via follower column. +func (o *UsersMetadatum) FollowerFollowLists(mods ...qm.QueryMod) followListQuery { + var queryMods []qm.QueryMod + if len(mods) != 0 { + queryMods = append(queryMods, mods...) + } + + queryMods = append(queryMods, + qm.Where("\"follow_list\".\"follower\"=?", o.PubKey), + ) + + return FollowLists(queryMods...) +} + +// FollowingFollowLists retrieves all the follow_list's FollowLists with an executor via following column. +func (o *UsersMetadatum) FollowingFollowLists(mods ...qm.QueryMod) followListQuery { + var queryMods []qm.QueryMod + if len(mods) != 0 { + queryMods = append(queryMods, mods...) + } + + queryMods = append(queryMods, + qm.Where("\"follow_list\".\"following\"=?", o.PubKey), + ) + + return FollowLists(queryMods...) +} + +// UsersMetadatapubKeyReactions retrieves all the reaction's Reactions with an executor via users_metadatapub_key column. +func (o *UsersMetadatum) UsersMetadatapubKeyReactions(mods ...qm.QueryMod) reactionQuery { + var queryMods []qm.QueryMod + if len(mods) != 0 { + queryMods = append(queryMods, mods...) + } + + queryMods = append(queryMods, + qm.Where("\"reactions\".\"users_metadatapub_key\"=?", o.PubKey), + ) + + return Reactions(queryMods...) +} + +// UsersMetadatapubKeyTextNotes retrieves all the text_note's TextNotes with an executor via users_metadatapub_key column. +func (o *UsersMetadatum) UsersMetadatapubKeyTextNotes(mods ...qm.QueryMod) textNoteQuery { + var queryMods []qm.QueryMod + if len(mods) != 0 { + queryMods = append(queryMods, mods...) + } + + queryMods = append(queryMods, + qm.Where("\"text_notes\".\"users_metadatapub_key\"=?", o.PubKey), + ) + + return TextNotes(queryMods...) +} + +// LoadFollowerFollowLists allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for a 1-M or N-M relationship. +func (usersMetadatumL) LoadFollowerFollowLists(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { + var slice []*UsersMetadatum + var object *UsersMetadatum + + if singular { + var ok bool + object, ok = maybeUsersMetadatum.(*UsersMetadatum) + if !ok { + object = new(UsersMetadatum) + ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) + } + } + } else { + s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &usersMetadatumR{} + } + args[object.PubKey] = struct{}{} + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &usersMetadatumR{} + } + args[obj.PubKey] = struct{}{} + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`follow_list`), + qm.WhereIn(`follow_list.follower in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load follow_list") + } + + var resultSlice []*FollowList + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice follow_list") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results in eager load on follow_list") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for follow_list") + } + + if len(followListAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + if singular { + object.R.FollowerFollowLists = resultSlice + for _, foreign := range resultSlice { + if foreign.R == nil { + foreign.R = &followListR{} + } + foreign.R.FollowerUsersMetadatum = object + } + return nil + } + + for _, foreign := range resultSlice { + for _, local := range slice { + if local.PubKey == foreign.Follower { + local.R.FollowerFollowLists = append(local.R.FollowerFollowLists, foreign) + if foreign.R == nil { + foreign.R = &followListR{} + } + foreign.R.FollowerUsersMetadatum = local + break + } + } + } + + return nil +} + +// LoadFollowingFollowLists allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for a 1-M or N-M relationship. +func (usersMetadatumL) LoadFollowingFollowLists(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { + var slice []*UsersMetadatum + var object *UsersMetadatum + + if singular { + var ok bool + object, ok = maybeUsersMetadatum.(*UsersMetadatum) + if !ok { + object = new(UsersMetadatum) + ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) + } + } + } else { + s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &usersMetadatumR{} + } + args[object.PubKey] = struct{}{} + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &usersMetadatumR{} + } + args[obj.PubKey] = struct{}{} + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`follow_list`), + qm.WhereIn(`follow_list.following in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load follow_list") + } + + var resultSlice []*FollowList + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice follow_list") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results in eager load on follow_list") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for follow_list") + } + + if len(followListAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + if singular { + object.R.FollowingFollowLists = resultSlice + for _, foreign := range resultSlice { + if foreign.R == nil { + foreign.R = &followListR{} + } + foreign.R.FollowingUsersMetadatum = object + } + return nil + } + + for _, foreign := range resultSlice { + for _, local := range slice { + if local.PubKey == foreign.Following { + local.R.FollowingFollowLists = append(local.R.FollowingFollowLists, foreign) + if foreign.R == nil { + foreign.R = &followListR{} + } + foreign.R.FollowingUsersMetadatum = local + break + } + } + } + + return nil +} + +// LoadUsersMetadatapubKeyReactions allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for a 1-M or N-M relationship. +func (usersMetadatumL) LoadUsersMetadatapubKeyReactions(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { + var slice []*UsersMetadatum + var object *UsersMetadatum + + if singular { + var ok bool + object, ok = maybeUsersMetadatum.(*UsersMetadatum) + if !ok { + object = new(UsersMetadatum) + ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) + } + } + } else { + s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &usersMetadatumR{} + } + args[object.PubKey] = struct{}{} + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &usersMetadatumR{} + } + args[obj.PubKey] = struct{}{} + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`reactions`), + qm.WhereIn(`reactions.users_metadatapub_key in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load reactions") + } + + var resultSlice []*Reaction + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice reactions") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results in eager load on reactions") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for reactions") + } + + if len(reactionAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + if singular { + object.R.UsersMetadatapubKeyReactions = resultSlice + for _, foreign := range resultSlice { + if foreign.R == nil { + foreign.R = &reactionR{} + } + foreign.R.UsersMetadatapubKeyUsersMetadatum = object + } + return nil + } + + for _, foreign := range resultSlice { + for _, local := range slice { + if queries.Equal(local.PubKey, foreign.UsersMetadatapubKey) { + local.R.UsersMetadatapubKeyReactions = append(local.R.UsersMetadatapubKeyReactions, foreign) + if foreign.R == nil { + foreign.R = &reactionR{} + } + foreign.R.UsersMetadatapubKeyUsersMetadatum = local + break + } + } + } + + return nil +} + +// LoadUsersMetadatapubKeyTextNotes allows an eager lookup of values, cached into the +// loaded structs of the objects. This is for a 1-M or N-M relationship. +func (usersMetadatumL) LoadUsersMetadatapubKeyTextNotes(ctx context.Context, e boil.ContextExecutor, singular bool, maybeUsersMetadatum interface{}, mods queries.Applicator) error { + var slice []*UsersMetadatum + var object *UsersMetadatum + + if singular { + var ok bool + object, ok = maybeUsersMetadatum.(*UsersMetadatum) + if !ok { + object = new(UsersMetadatum) + ok = queries.SetFromEmbeddedStruct(&object, &maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, maybeUsersMetadatum)) + } + } + } else { + s, ok := maybeUsersMetadatum.(*[]*UsersMetadatum) + if ok { + slice = *s + } else { + ok = queries.SetFromEmbeddedStruct(&slice, maybeUsersMetadatum) + if !ok { + return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, maybeUsersMetadatum)) + } + } + } + + args := make(map[interface{}]struct{}) + if singular { + if object.R == nil { + object.R = &usersMetadatumR{} + } + args[object.PubKey] = struct{}{} + } else { + for _, obj := range slice { + if obj.R == nil { + obj.R = &usersMetadatumR{} + } + args[obj.PubKey] = struct{}{} + } + } + + if len(args) == 0 { + return nil + } + + argsSlice := make([]interface{}, len(args)) + i := 0 + for arg := range args { + argsSlice[i] = arg + i++ + } + + query := NewQuery( + qm.From(`text_notes`), + qm.WhereIn(`text_notes.users_metadatapub_key in ?`, argsSlice...), + ) + if mods != nil { + mods.Apply(query) + } + + results, err := query.QueryContext(ctx, e) + if err != nil { + return errors.Wrap(err, "failed to eager load text_notes") + } + + var resultSlice []*TextNote + if err = queries.Bind(results, &resultSlice); err != nil { + return errors.Wrap(err, "failed to bind eager loaded slice text_notes") + } + + if err = results.Close(); err != nil { + return errors.Wrap(err, "failed to close results in eager load on text_notes") + } + if err = results.Err(); err != nil { + return errors.Wrap(err, "error occurred during iteration of eager loaded relations for text_notes") + } + + if len(textNoteAfterSelectHooks) != 0 { + for _, obj := range resultSlice { + if err := obj.doAfterSelectHooks(ctx, e); err != nil { + return err + } + } + } + if singular { + object.R.UsersMetadatapubKeyTextNotes = resultSlice + for _, foreign := range resultSlice { + if foreign.R == nil { + foreign.R = &textNoteR{} + } + foreign.R.UsersMetadatapubKeyUsersMetadatum = object + } + return nil + } + + for _, foreign := range resultSlice { + for _, local := range slice { + if queries.Equal(local.PubKey, foreign.UsersMetadatapubKey) { + local.R.UsersMetadatapubKeyTextNotes = append(local.R.UsersMetadatapubKeyTextNotes, foreign) + if foreign.R == nil { + foreign.R = &textNoteR{} + } + foreign.R.UsersMetadatapubKeyUsersMetadatum = local + break + } + } + } + + return nil +} + +// AddFollowerFollowListsG adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.FollowerFollowLists. +// Sets related.R.FollowerUsersMetadatum appropriately. +// Uses the global database handle. +func (o *UsersMetadatum) AddFollowerFollowListsG(ctx context.Context, insert bool, related ...*FollowList) error { + return o.AddFollowerFollowLists(ctx, boil.GetContextDB(), insert, related...) +} + +// AddFollowerFollowLists adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.FollowerFollowLists. +// Sets related.R.FollowerUsersMetadatum appropriately. +func (o *UsersMetadatum) AddFollowerFollowLists(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*FollowList) error { + var err error + for _, rel := range related { + if insert { + rel.Follower = o.PubKey + if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } else { + updateQuery := fmt.Sprintf( + "UPDATE \"follow_list\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"follower"}), + strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), + ) + values := []interface{}{o.PubKey, rel.Follower, rel.Following} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update foreign table") + } + + rel.Follower = o.PubKey + } + } + + if o.R == nil { + o.R = &usersMetadatumR{ + FollowerFollowLists: related, + } + } else { + o.R.FollowerFollowLists = append(o.R.FollowerFollowLists, related...) + } + + for _, rel := range related { + if rel.R == nil { + rel.R = &followListR{ + FollowerUsersMetadatum: o, + } + } else { + rel.R.FollowerUsersMetadatum = o + } + } + return nil +} + +// AddFollowingFollowListsG adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.FollowingFollowLists. +// Sets related.R.FollowingUsersMetadatum appropriately. +// Uses the global database handle. +func (o *UsersMetadatum) AddFollowingFollowListsG(ctx context.Context, insert bool, related ...*FollowList) error { + return o.AddFollowingFollowLists(ctx, boil.GetContextDB(), insert, related...) +} + +// AddFollowingFollowLists adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.FollowingFollowLists. +// Sets related.R.FollowingUsersMetadatum appropriately. +func (o *UsersMetadatum) AddFollowingFollowLists(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*FollowList) error { + var err error + for _, rel := range related { + if insert { + rel.Following = o.PubKey + if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } else { + updateQuery := fmt.Sprintf( + "UPDATE \"follow_list\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"following"}), + strmangle.WhereClause("\"", "\"", 2, followListPrimaryKeyColumns), + ) + values := []interface{}{o.PubKey, rel.Follower, rel.Following} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update foreign table") + } + + rel.Following = o.PubKey + } + } + + if o.R == nil { + o.R = &usersMetadatumR{ + FollowingFollowLists: related, + } + } else { + o.R.FollowingFollowLists = append(o.R.FollowingFollowLists, related...) + } + + for _, rel := range related { + if rel.R == nil { + rel.R = &followListR{ + FollowingUsersMetadatum: o, + } + } else { + rel.R.FollowingUsersMetadatum = o + } + } + return nil +} + +// AddUsersMetadatapubKeyReactionsG adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.UsersMetadatapubKeyReactions. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. +// Uses the global database handle. +func (o *UsersMetadatum) AddUsersMetadatapubKeyReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { + return o.AddUsersMetadatapubKeyReactions(ctx, boil.GetContextDB(), insert, related...) +} + +// AddUsersMetadatapubKeyReactions adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.UsersMetadatapubKeyReactions. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. +func (o *UsersMetadatum) AddUsersMetadatapubKeyReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { + var err error + for _, rel := range related { + if insert { + queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) + if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } else { + updateQuery := fmt.Sprintf( + "UPDATE \"reactions\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), + strmangle.WhereClause("\"", "\"", 2, reactionPrimaryKeyColumns), + ) + values := []interface{}{o.PubKey, rel.ID} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update foreign table") + } + + queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) + } + } + + if o.R == nil { + o.R = &usersMetadatumR{ + UsersMetadatapubKeyReactions: related, + } + } else { + o.R.UsersMetadatapubKeyReactions = append(o.R.UsersMetadatapubKeyReactions, related...) + } + + for _, rel := range related { + if rel.R == nil { + rel.R = &reactionR{ + UsersMetadatapubKeyUsersMetadatum: o, + } + } else { + rel.R.UsersMetadatapubKeyUsersMetadatum = o + } + } + return nil +} + +// SetUsersMetadatapubKeyReactionsG removes all previously related items of the +// users_metadatum replacing them completely with the passed +// in related items, optionally inserting them as new records. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. +// Replaces o.R.UsersMetadatapubKeyReactions with related. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. +// Uses the global database handle. +func (o *UsersMetadatum) SetUsersMetadatapubKeyReactionsG(ctx context.Context, insert bool, related ...*Reaction) error { + return o.SetUsersMetadatapubKeyReactions(ctx, boil.GetContextDB(), insert, related...) +} + +// SetUsersMetadatapubKeyReactions removes all previously related items of the +// users_metadatum replacing them completely with the passed +// in related items, optionally inserting them as new records. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. +// Replaces o.R.UsersMetadatapubKeyReactions with related. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyReactions accordingly. +func (o *UsersMetadatum) SetUsersMetadatapubKeyReactions(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*Reaction) error { + query := "update \"reactions\" set \"users_metadatapub_key\" = null where \"users_metadatapub_key\" = $1" + values := []interface{}{o.PubKey} + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, query) + fmt.Fprintln(writer, values) + } + _, err := exec.ExecContext(ctx, query, values...) + if err != nil { + return errors.Wrap(err, "failed to remove relationships before set") + } + + if o.R != nil { + for _, rel := range o.R.UsersMetadatapubKeyReactions { + queries.SetScanner(&rel.UsersMetadatapubKey, nil) + if rel.R == nil { + continue + } + + rel.R.UsersMetadatapubKeyUsersMetadatum = nil + } + o.R.UsersMetadatapubKeyReactions = nil + } + + return o.AddUsersMetadatapubKeyReactions(ctx, exec, insert, related...) +} + +// RemoveUsersMetadatapubKeyReactionsG relationships from objects passed in. +// Removes related items from R.UsersMetadatapubKeyReactions (uses pointer comparison, removal does not keep order) +// Sets related.R.UsersMetadatapubKeyUsersMetadatum. +// Uses the global database handle. +func (o *UsersMetadatum) RemoveUsersMetadatapubKeyReactionsG(ctx context.Context, related ...*Reaction) error { + return o.RemoveUsersMetadatapubKeyReactions(ctx, boil.GetContextDB(), related...) +} + +// RemoveUsersMetadatapubKeyReactions relationships from objects passed in. +// Removes related items from R.UsersMetadatapubKeyReactions (uses pointer comparison, removal does not keep order) +// Sets related.R.UsersMetadatapubKeyUsersMetadatum. +func (o *UsersMetadatum) RemoveUsersMetadatapubKeyReactions(ctx context.Context, exec boil.ContextExecutor, related ...*Reaction) error { + if len(related) == 0 { + return nil + } + + var err error + for _, rel := range related { + queries.SetScanner(&rel.UsersMetadatapubKey, nil) + if rel.R != nil { + rel.R.UsersMetadatapubKeyUsersMetadatum = nil + } + if _, err = rel.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { + return err + } + } + if o.R == nil { + return nil + } + + for _, rel := range related { + for i, ri := range o.R.UsersMetadatapubKeyReactions { + if rel != ri { + continue + } + + ln := len(o.R.UsersMetadatapubKeyReactions) + if ln > 1 && i < ln-1 { + o.R.UsersMetadatapubKeyReactions[i] = o.R.UsersMetadatapubKeyReactions[ln-1] + } + o.R.UsersMetadatapubKeyReactions = o.R.UsersMetadatapubKeyReactions[:ln-1] + break + } + } + + return nil +} + +// AddUsersMetadatapubKeyTextNotesG adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.UsersMetadatapubKeyTextNotes. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. +// Uses the global database handle. +func (o *UsersMetadatum) AddUsersMetadatapubKeyTextNotesG(ctx context.Context, insert bool, related ...*TextNote) error { + return o.AddUsersMetadatapubKeyTextNotes(ctx, boil.GetContextDB(), insert, related...) +} + +// AddUsersMetadatapubKeyTextNotes adds the given related objects to the existing relationships +// of the users_metadatum, optionally inserting them as new records. +// Appends related to o.R.UsersMetadatapubKeyTextNotes. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum appropriately. +func (o *UsersMetadatum) AddUsersMetadatapubKeyTextNotes(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*TextNote) error { + var err error + for _, rel := range related { + if insert { + queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) + if err = rel.Insert(ctx, exec, boil.Infer()); err != nil { + return errors.Wrap(err, "failed to insert into foreign table") + } + } else { + updateQuery := fmt.Sprintf( + "UPDATE \"text_notes\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, []string{"users_metadatapub_key"}), + strmangle.WhereClause("\"", "\"", 2, textNotePrimaryKeyColumns), + ) + values := []interface{}{o.PubKey, rel.ID} + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, updateQuery) + fmt.Fprintln(writer, values) + } + if _, err = exec.ExecContext(ctx, updateQuery, values...); err != nil { + return errors.Wrap(err, "failed to update foreign table") + } + + queries.Assign(&rel.UsersMetadatapubKey, o.PubKey) + } + } + + if o.R == nil { + o.R = &usersMetadatumR{ + UsersMetadatapubKeyTextNotes: related, + } + } else { + o.R.UsersMetadatapubKeyTextNotes = append(o.R.UsersMetadatapubKeyTextNotes, related...) + } + + for _, rel := range related { + if rel.R == nil { + rel.R = &textNoteR{ + UsersMetadatapubKeyUsersMetadatum: o, + } + } else { + rel.R.UsersMetadatapubKeyUsersMetadatum = o + } + } + return nil +} + +// SetUsersMetadatapubKeyTextNotesG removes all previously related items of the +// users_metadatum replacing them completely with the passed +// in related items, optionally inserting them as new records. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. +// Replaces o.R.UsersMetadatapubKeyTextNotes with related. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. +// Uses the global database handle. +func (o *UsersMetadatum) SetUsersMetadatapubKeyTextNotesG(ctx context.Context, insert bool, related ...*TextNote) error { + return o.SetUsersMetadatapubKeyTextNotes(ctx, boil.GetContextDB(), insert, related...) +} + +// SetUsersMetadatapubKeyTextNotes removes all previously related items of the +// users_metadatum replacing them completely with the passed +// in related items, optionally inserting them as new records. +// Sets o.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. +// Replaces o.R.UsersMetadatapubKeyTextNotes with related. +// Sets related.R.UsersMetadatapubKeyUsersMetadatum's UsersMetadatapubKeyTextNotes accordingly. +func (o *UsersMetadatum) SetUsersMetadatapubKeyTextNotes(ctx context.Context, exec boil.ContextExecutor, insert bool, related ...*TextNote) error { + query := "update \"text_notes\" set \"users_metadatapub_key\" = null where \"users_metadatapub_key\" = $1" + values := []interface{}{o.PubKey} + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, query) + fmt.Fprintln(writer, values) + } + _, err := exec.ExecContext(ctx, query, values...) + if err != nil { + return errors.Wrap(err, "failed to remove relationships before set") + } + + if o.R != nil { + for _, rel := range o.R.UsersMetadatapubKeyTextNotes { + queries.SetScanner(&rel.UsersMetadatapubKey, nil) + if rel.R == nil { + continue + } + + rel.R.UsersMetadatapubKeyUsersMetadatum = nil + } + o.R.UsersMetadatapubKeyTextNotes = nil + } + + return o.AddUsersMetadatapubKeyTextNotes(ctx, exec, insert, related...) +} + +// RemoveUsersMetadatapubKeyTextNotesG relationships from objects passed in. +// Removes related items from R.UsersMetadatapubKeyTextNotes (uses pointer comparison, removal does not keep order) +// Sets related.R.UsersMetadatapubKeyUsersMetadatum. +// Uses the global database handle. +func (o *UsersMetadatum) RemoveUsersMetadatapubKeyTextNotesG(ctx context.Context, related ...*TextNote) error { + return o.RemoveUsersMetadatapubKeyTextNotes(ctx, boil.GetContextDB(), related...) +} + +// RemoveUsersMetadatapubKeyTextNotes relationships from objects passed in. +// Removes related items from R.UsersMetadatapubKeyTextNotes (uses pointer comparison, removal does not keep order) +// Sets related.R.UsersMetadatapubKeyUsersMetadatum. +func (o *UsersMetadatum) RemoveUsersMetadatapubKeyTextNotes(ctx context.Context, exec boil.ContextExecutor, related ...*TextNote) error { + if len(related) == 0 { + return nil + } + + var err error + for _, rel := range related { + queries.SetScanner(&rel.UsersMetadatapubKey, nil) + if rel.R != nil { + rel.R.UsersMetadatapubKeyUsersMetadatum = nil + } + if _, err = rel.Update(ctx, exec, boil.Whitelist("users_metadatapub_key")); err != nil { + return err + } + } + if o.R == nil { + return nil + } + + for _, rel := range related { + for i, ri := range o.R.UsersMetadatapubKeyTextNotes { + if rel != ri { + continue + } + + ln := len(o.R.UsersMetadatapubKeyTextNotes) + if ln > 1 && i < ln-1 { + o.R.UsersMetadatapubKeyTextNotes[i] = o.R.UsersMetadatapubKeyTextNotes[ln-1] + } + o.R.UsersMetadatapubKeyTextNotes = o.R.UsersMetadatapubKeyTextNotes[:ln-1] + break + } + } + + return nil +} + +// UsersMetadata retrieves all the records using an executor. +func UsersMetadata(mods ...qm.QueryMod) usersMetadatumQuery { + mods = append(mods, qm.From("\"users_metadata\"")) + q := NewQuery(mods...) + if len(queries.GetSelect(q)) == 0 { + queries.SetSelect(q, []string{"\"users_metadata\".*"}) + } + + return usersMetadatumQuery{q} +} + +// FindUsersMetadatumG retrieves a single record by ID. +func FindUsersMetadatumG(ctx context.Context, pubKey string, selectCols ...string) (*UsersMetadatum, error) { + return FindUsersMetadatum(ctx, boil.GetContextDB(), pubKey, selectCols...) +} + +// FindUsersMetadatum retrieves a single record by ID with an executor. +// If selectCols is empty Find will return all columns. +func FindUsersMetadatum(ctx context.Context, exec boil.ContextExecutor, pubKey string, selectCols ...string) (*UsersMetadatum, error) { + usersMetadatumObj := &UsersMetadatum{} + + sel := "*" + if len(selectCols) > 0 { + sel = strings.Join(strmangle.IdentQuoteSlice(dialect.LQ, dialect.RQ, selectCols), ",") + } + query := fmt.Sprintf( + "select %s from \"users_metadata\" where \"pub_key\"=$1", sel, + ) + + q := queries.Raw(query, pubKey) + + err := q.Bind(ctx, exec, usersMetadatumObj) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, sql.ErrNoRows + } + return nil, errors.Wrap(err, "models: unable to select from users_metadata") + } + + if err = usersMetadatumObj.doAfterSelectHooks(ctx, exec); err != nil { + return usersMetadatumObj, err + } + + return usersMetadatumObj, nil +} + +// InsertG a single record. See Insert for whitelist behavior description. +func (o *UsersMetadatum) InsertG(ctx context.Context, columns boil.Columns) error { + return o.Insert(ctx, boil.GetContextDB(), columns) +} + +// Insert a single record using an executor. +// See boil.Columns.InsertColumnSet documentation to understand column list inference for inserts. +func (o *UsersMetadatum) Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error { + if o == nil { + return errors.New("models: no users_metadata provided for insertion") + } + + var err error + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + if o.UpdatedAt.IsZero() { + o.UpdatedAt = currTime + } + } + + if err := o.doBeforeInsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(usersMetadatumColumnsWithDefault, o) + + key := makeCacheKey(columns, nzDefaults) + usersMetadatumInsertCacheMut.RLock() + cache, cached := usersMetadatumInsertCache[key] + usersMetadatumInsertCacheMut.RUnlock() + + if !cached { + wl, returnColumns := columns.InsertColumnSet( + usersMetadatumAllColumns, + usersMetadatumColumnsWithDefault, + usersMetadatumColumnsWithoutDefault, + nzDefaults, + ) + + cache.valueMapping, err = queries.BindMapping(usersMetadatumType, usersMetadatumMapping, wl) + if err != nil { + return err + } + cache.retMapping, err = queries.BindMapping(usersMetadatumType, usersMetadatumMapping, returnColumns) + if err != nil { + return err + } + if len(wl) != 0 { + cache.query = fmt.Sprintf("INSERT INTO \"users_metadata\" (\"%s\") %%sVALUES (%s)%%s", strings.Join(wl, "\",\""), strmangle.Placeholders(dialect.UseIndexPlaceholders, len(wl), 1, 1)) + } else { + cache.query = "INSERT INTO \"users_metadata\" %sDEFAULT VALUES%s" + } + + var queryOutput, queryReturning string + + if len(cache.retMapping) != 0 { + queryReturning = fmt.Sprintf(" RETURNING \"%s\"", strings.Join(returnColumns, "\",\"")) + } + + cache.query = fmt.Sprintf(cache.query, queryOutput, queryReturning) + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(queries.PtrsFromMapping(value, cache.retMapping)...) + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + + if err != nil { + return errors.Wrap(err, "models: unable to insert into users_metadata") + } + + if !cached { + usersMetadatumInsertCacheMut.Lock() + usersMetadatumInsertCache[key] = cache + usersMetadatumInsertCacheMut.Unlock() + } + + return o.doAfterInsertHooks(ctx, exec) +} + +// UpdateG a single UsersMetadatum record using the global executor. +// See Update for more documentation. +func (o *UsersMetadatum) UpdateG(ctx context.Context, columns boil.Columns) (int64, error) { + return o.Update(ctx, boil.GetContextDB(), columns) +} + +// Update uses an executor to update the UsersMetadatum. +// See boil.Columns.UpdateColumnSet documentation to understand column list inference for updates. +// Update does not automatically update the record in case of default values. Use .Reload() to refresh the records. +func (o *UsersMetadatum) Update(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) (int64, error) { + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + o.UpdatedAt = currTime + } + + var err error + if err = o.doBeforeUpdateHooks(ctx, exec); err != nil { + return 0, err + } + key := makeCacheKey(columns, nil) + usersMetadatumUpdateCacheMut.RLock() + cache, cached := usersMetadatumUpdateCache[key] + usersMetadatumUpdateCacheMut.RUnlock() + + if !cached { + wl := columns.UpdateColumnSet( + usersMetadatumAllColumns, + usersMetadatumPrimaryKeyColumns, + ) + + if !columns.IsWhitelist() { + wl = strmangle.SetComplement(wl, []string{"created_at"}) + } + if len(wl) == 0 { + return 0, errors.New("models: unable to update users_metadata, could not build whitelist") + } + + cache.query = fmt.Sprintf("UPDATE \"users_metadata\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, wl), + strmangle.WhereClause("\"", "\"", len(wl)+1, usersMetadatumPrimaryKeyColumns), + ) + cache.valueMapping, err = queries.BindMapping(usersMetadatumType, usersMetadatumMapping, append(wl, usersMetadatumPrimaryKeyColumns...)) + if err != nil { + return 0, err + } + } + + values := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), cache.valueMapping) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, values) + } + var result sql.Result + result, err = exec.ExecContext(ctx, cache.query, values...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update users_metadata row") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by update for users_metadata") + } + + if !cached { + usersMetadatumUpdateCacheMut.Lock() + usersMetadatumUpdateCache[key] = cache + usersMetadatumUpdateCacheMut.Unlock() + } + + return rowsAff, o.doAfterUpdateHooks(ctx, exec) +} + +// UpdateAllG updates all rows with the specified column values. +func (q usersMetadatumQuery) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return q.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values. +func (q usersMetadatumQuery) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + queries.SetUpdate(q.Query, cols) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all for users_metadata") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected for users_metadata") + } + + return rowsAff, nil +} + +// UpdateAllG updates all rows with the specified column values. +func (o UsersMetadatumSlice) UpdateAllG(ctx context.Context, cols M) (int64, error) { + return o.UpdateAll(ctx, boil.GetContextDB(), cols) +} + +// UpdateAll updates all rows with the specified column values, using an executor. +func (o UsersMetadatumSlice) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) { + ln := int64(len(o)) + if ln == 0 { + return 0, nil + } + + if len(cols) == 0 { + return 0, errors.New("models: update all requires at least one column argument") + } + + colNames := make([]string, len(cols)) + args := make([]interface{}, len(cols)) + + i := 0 + for name, value := range cols { + colNames[i] = name + args[i] = value + i++ + } + + // Append all of the primary key values for each column + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), usersMetadatumPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := fmt.Sprintf("UPDATE \"users_metadata\" SET %s WHERE %s", + strmangle.SetParamNames("\"", "\"", 1, colNames), + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), len(colNames)+1, usersMetadatumPrimaryKeyColumns, len(o))) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to update all in usersMetadatum slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: unable to retrieve rows affected all in update all usersMetadatum") + } + return rowsAff, nil +} + +// UpsertG attempts an insert, and does an update or ignore on conflict. +func (o *UsersMetadatum) UpsertG(ctx context.Context, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + return o.Upsert(ctx, boil.GetContextDB(), updateOnConflict, conflictColumns, updateColumns, insertColumns, opts...) +} + +// Upsert attempts an insert using an executor, and does an update or ignore on conflict. +// See boil.Columns documentation for how to properly use updateColumns and insertColumns. +func (o *UsersMetadatum) Upsert(ctx context.Context, exec boil.ContextExecutor, updateOnConflict bool, conflictColumns []string, updateColumns, insertColumns boil.Columns, opts ...UpsertOptionFunc) error { + if o == nil { + return errors.New("models: no users_metadata provided for upsert") + } + if !boil.TimestampsAreSkipped(ctx) { + currTime := time.Now().In(boil.GetLocation()) + + if o.CreatedAt.IsZero() { + o.CreatedAt = currTime + } + o.UpdatedAt = currTime + } + + if err := o.doBeforeUpsertHooks(ctx, exec); err != nil { + return err + } + + nzDefaults := queries.NonZeroDefaultSet(usersMetadatumColumnsWithDefault, o) + + // Build cache key in-line uglily - mysql vs psql problems + buf := strmangle.GetBuffer() + if updateOnConflict { + buf.WriteByte('t') + } else { + buf.WriteByte('f') + } + buf.WriteByte('.') + for _, c := range conflictColumns { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(updateColumns.Kind)) + for _, c := range updateColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(insertColumns.Kind)) + for _, c := range insertColumns.Cols { + buf.WriteString(c) + } + buf.WriteByte('.') + for _, c := range nzDefaults { + buf.WriteString(c) + } + key := buf.String() + strmangle.PutBuffer(buf) + + usersMetadatumUpsertCacheMut.RLock() + cache, cached := usersMetadatumUpsertCache[key] + usersMetadatumUpsertCacheMut.RUnlock() + + var err error + + if !cached { + insert, _ := insertColumns.InsertColumnSet( + usersMetadatumAllColumns, + usersMetadatumColumnsWithDefault, + usersMetadatumColumnsWithoutDefault, + nzDefaults, + ) + + update := updateColumns.UpdateColumnSet( + usersMetadatumAllColumns, + usersMetadatumPrimaryKeyColumns, + ) + + if updateOnConflict && len(update) == 0 { + return errors.New("models: unable to upsert users_metadata, could not build update column list") + } + + ret := strmangle.SetComplement(usersMetadatumAllColumns, strmangle.SetIntersect(insert, update)) + + conflict := conflictColumns + if len(conflict) == 0 && updateOnConflict && len(update) != 0 { + if len(usersMetadatumPrimaryKeyColumns) == 0 { + return errors.New("models: unable to upsert users_metadata, could not build conflict column list") + } + + conflict = make([]string, len(usersMetadatumPrimaryKeyColumns)) + copy(conflict, usersMetadatumPrimaryKeyColumns) + } + cache.query = buildUpsertQueryPostgres(dialect, "\"users_metadata\"", updateOnConflict, ret, update, conflict, insert, opts...) + + cache.valueMapping, err = queries.BindMapping(usersMetadatumType, usersMetadatumMapping, insert) + if err != nil { + return err + } + if len(ret) != 0 { + cache.retMapping, err = queries.BindMapping(usersMetadatumType, usersMetadatumMapping, ret) + if err != nil { + return err + } + } + } + + value := reflect.Indirect(reflect.ValueOf(o)) + vals := queries.ValuesFromMapping(value, cache.valueMapping) + var returns []interface{} + if len(cache.retMapping) != 0 { + returns = queries.PtrsFromMapping(value, cache.retMapping) + } + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, cache.query) + fmt.Fprintln(writer, vals) + } + if len(cache.retMapping) != 0 { + err = exec.QueryRowContext(ctx, cache.query, vals...).Scan(returns...) + if errors.Is(err, sql.ErrNoRows) { + err = nil // Postgres doesn't return anything when there's no update + } + } else { + _, err = exec.ExecContext(ctx, cache.query, vals...) + } + if err != nil { + return errors.Wrap(err, "models: unable to upsert users_metadata") + } + + if !cached { + usersMetadatumUpsertCacheMut.Lock() + usersMetadatumUpsertCache[key] = cache + usersMetadatumUpsertCacheMut.Unlock() + } + + return o.doAfterUpsertHooks(ctx, exec) +} + +// DeleteG deletes a single UsersMetadatum record. +// DeleteG will match against the primary key column to find the record to delete. +func (o *UsersMetadatum) DeleteG(ctx context.Context) (int64, error) { + return o.Delete(ctx, boil.GetContextDB()) +} + +// Delete deletes a single UsersMetadatum record with an executor. +// Delete will match against the primary key column to find the record to delete. +func (o *UsersMetadatum) Delete(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if o == nil { + return 0, errors.New("models: no UsersMetadatum provided for delete") + } + + if err := o.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + args := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), usersMetadatumPrimaryKeyMapping) + sql := "DELETE FROM \"users_metadata\" WHERE \"pub_key\"=$1" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args...) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete from users_metadata") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by delete for users_metadata") + } + + if err := o.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + + return rowsAff, nil +} + +func (q usersMetadatumQuery) DeleteAllG(ctx context.Context) (int64, error) { + return q.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all matching rows. +func (q usersMetadatumQuery) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if q.Query == nil { + return 0, errors.New("models: no usersMetadatumQuery provided for delete all") + } + + queries.SetDelete(q.Query) + + result, err := q.Query.ExecContext(ctx, exec) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from users_metadata") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for users_metadata") + } + + return rowsAff, nil +} + +// DeleteAllG deletes all rows in the slice. +func (o UsersMetadatumSlice) DeleteAllG(ctx context.Context) (int64, error) { + return o.DeleteAll(ctx, boil.GetContextDB()) +} + +// DeleteAll deletes all rows in the slice, using an executor. +func (o UsersMetadatumSlice) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) { + if len(o) == 0 { + return 0, nil + } + + if len(usersMetadatumBeforeDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doBeforeDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + var args []interface{} + for _, obj := range o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), usersMetadatumPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "DELETE FROM \"users_metadata\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, usersMetadatumPrimaryKeyColumns, len(o)) + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, args) + } + result, err := exec.ExecContext(ctx, sql, args...) + if err != nil { + return 0, errors.Wrap(err, "models: unable to delete all from usersMetadatum slice") + } + + rowsAff, err := result.RowsAffected() + if err != nil { + return 0, errors.Wrap(err, "models: failed to get rows affected by deleteall for users_metadata") + } + + if len(usersMetadatumAfterDeleteHooks) != 0 { + for _, obj := range o { + if err := obj.doAfterDeleteHooks(ctx, exec); err != nil { + return 0, err + } + } + } + + return rowsAff, nil +} + +// ReloadG refetches the object from the database using the primary keys. +func (o *UsersMetadatum) ReloadG(ctx context.Context) error { + if o == nil { + return errors.New("models: no UsersMetadatum provided for reload") + } + + return o.Reload(ctx, boil.GetContextDB()) +} + +// Reload refetches the object from the database +// using the primary keys with an executor. +func (o *UsersMetadatum) Reload(ctx context.Context, exec boil.ContextExecutor) error { + ret, err := FindUsersMetadatum(ctx, exec, o.PubKey) + if err != nil { + return err + } + + *o = *ret + return nil +} + +// ReloadAllG refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *UsersMetadatumSlice) ReloadAllG(ctx context.Context) error { + if o == nil { + return errors.New("models: empty UsersMetadatumSlice provided for reload all") + } + + return o.ReloadAll(ctx, boil.GetContextDB()) +} + +// ReloadAll refetches every row with matching primary key column values +// and overwrites the original object slice with the newly updated slice. +func (o *UsersMetadatumSlice) ReloadAll(ctx context.Context, exec boil.ContextExecutor) error { + if o == nil || len(*o) == 0 { + return nil + } + + slice := UsersMetadatumSlice{} + var args []interface{} + for _, obj := range *o { + pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), usersMetadatumPrimaryKeyMapping) + args = append(args, pkeyArgs...) + } + + sql := "SELECT \"users_metadata\".* FROM \"users_metadata\" WHERE " + + strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 1, usersMetadatumPrimaryKeyColumns, len(*o)) + + q := queries.Raw(sql, args...) + + err := q.Bind(ctx, exec, &slice) + if err != nil { + return errors.Wrap(err, "models: unable to reload all in UsersMetadatumSlice") + } + + *o = slice + + return nil +} + +// UsersMetadatumExistsG checks if the UsersMetadatum row exists. +func UsersMetadatumExistsG(ctx context.Context, pubKey string) (bool, error) { + return UsersMetadatumExists(ctx, boil.GetContextDB(), pubKey) +} + +// UsersMetadatumExists checks if the UsersMetadatum row exists. +func UsersMetadatumExists(ctx context.Context, exec boil.ContextExecutor, pubKey string) (bool, error) { + var exists bool + sql := "select exists(select 1 from \"users_metadata\" where \"pub_key\"=$1 limit 1)" + + if boil.IsDebug(ctx) { + writer := boil.DebugWriterFrom(ctx) + fmt.Fprintln(writer, sql) + fmt.Fprintln(writer, pubKey) + } + row := exec.QueryRowContext(ctx, sql, pubKey) + + err := row.Scan(&exists) + if err != nil { + return false, errors.Wrap(err, "models: unable to check if users_metadata exists") + } + + return exists, nil +} + +// Exists checks if the UsersMetadatum row exists. +func (o *UsersMetadatum) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) { + return UsersMetadatumExists(ctx, exec, o.PubKey) +} diff --git a/relay/relay.go b/relay/relay.go index 18152db..7b74778 100644 --- a/relay/relay.go +++ b/relay/relay.go @@ -2,29 +2,37 @@ package relay import ( "github.com/dezh-tech/immortal/config" + "github.com/dezh-tech/immortal/database" "github.com/dezh-tech/immortal/server" ) // Relay keeps all concepts such as server, database and manages them. type Relay struct { - config config.Config - server *server.Server + config config.Config + server *server.Server + database *database.Database } // NewRelay creates a new relay. -func NewRelay(cfg config.Config) *Relay { - return &Relay{ - config: cfg, - server: server.NewServer(cfg.ServerConf), +func New(cfg config.Config) (*Relay, error) { + db, err := database.New(cfg.DSN) + if err != nil { + return nil, err } + + return &Relay{ + config: cfg, + server: server.NewServer(cfg.ServerConf), + database: db, + }, nil } -// Start runs the relay and its childs. +// Start runs the relay and its children. func (r *Relay) Start() error { return r.server.Start() } -// Stop shutdowns the relay and its childs gracefully. +// Stop shutdowns the relay and its children gracefully. func (r *Relay) Stop() error { return r.server.Stop() } diff --git a/sqlboiler.yml b/sqlboiler.yml new file mode 100644 index 0000000..2f5d5cd --- /dev/null +++ b/sqlboiler.yml @@ -0,0 +1,39 @@ +# sqlboiler.yml +# Configuration for sqlboiler +psql: + # Database connection details + dbname: dev_db + host: localhost + port: 5432 + user: dev_user + pass: dev_password + sslmode: disable + +# General settings +# Specifies which database drivers to use. Use "psql" for PostgreSQL +drivers: + - psql + +# Generation settings +pkgname: models # Package name to generate the ORM code into +output: models # Output directory where models are generated +no-tests: true # Disable generation of test files +no-hooks: false # Disable generation of hook functions +no-auto-timestamps: false # Disable auto timestamping on created_at/updated_at fields +no-back-referencing: false # Disable back-referencing for foreign keys + +# Adds struct tags to generated models +struct-tag-casing: snake # Control the casing of struct tags +struct-tags: json + +# Use context-based ORM methods +context: true + +# Generate singular names for models (e.g., "user" instead of "users") +singularize: false + +# Include foreign key relationships in generated models +add-global-variants: true # Include additional variant methods + +# Debugging settings +debug: true # Enable debug mode for SQL generation \ No newline at end of file