Skip to content

Commit e210458

Browse files
authored
Merge pull request #2 from inconceivableza/docker-support
Docker support
2 parents 1af5c69 + 7e77f6d commit e210458

File tree

6 files changed

+240
-62
lines changed

6 files changed

+240
-62
lines changed

Dockerfile

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# Use a multi-stage build for a smaller final image
2+
FROM golang:1.23-alpine AS builder
3+
4+
# Install build dependencies
5+
RUN apk add --no-cache make git
6+
7+
# Set up working directory
8+
WORKDIR /app
9+
10+
# Copy only the files needed for dependency installation first
11+
COPY go.mod go.sum ./
12+
RUN go mod download
13+
14+
# Copy the rest of the source code
15+
COPY . .
16+
17+
# Build for both architectures to support different platforms
18+
RUN make build_linux_amd64 && make build_linux_arm64
19+
20+
# Create a minimal runtime image
21+
FROM --platform=$TARGETPLATFORM alpine:3.19 AS runtime
22+
23+
# Install CA certificates for HTTPS requests
24+
RUN apk add --no-cache ca-certificates tzdata
25+
26+
# Create a non-root user to run the application
27+
RUN adduser -D -h /app appuser
28+
29+
# Create directories for application data
30+
WORKDIR /app
31+
RUN mkdir -p /app/downloads && \
32+
chown -R appuser:appuser /app
33+
34+
# Create the entrypoint script that will generate .env
35+
RUN echo '#!/bin/sh' > /app/entrypoint.sh && \
36+
echo 'echo "SERVER_HOST=$SERVER_HOST" > /app/.env' >> /app/entrypoint.sh && \
37+
echo 'echo "SERVER_PORT=$SERVER_PORT" >> /app/.env' >> /app/entrypoint.sh && \
38+
echo 'echo "API_KEY=$API_KEY" >> /app/.env' >> /app/entrypoint.sh && \
39+
echo 'echo "COUNTRY=$COUNTRY" >> /app/.env' >> /app/entrypoint.sh && \
40+
echo 'echo "CITY=$CITY" >> /app/.env' >> /app/entrypoint.sh && \
41+
echo 'echo "ASN=$ASN" >> /app/.env' >> /app/entrypoint.sh && \
42+
echo 'echo "UPDATE_TIME=$UPDATE_TIME" >> /app/.env' >> /app/entrypoint.sh && \
43+
echo 'echo "LOAD_LOG_FREQ=$LOAD_LOG_FREQ" >> /app/.env' >> /app/entrypoint.sh && \
44+
echo 'echo "DB_TYPE=$DB_TYPE" >> /app/.env' >> /app/entrypoint.sh && \
45+
echo '' >> /app/entrypoint.sh && \
46+
echo '# Add database variables if they are set' >> /app/entrypoint.sh && \
47+
echo 'if [ ! -z "$DB_HOST" ]; then' >> /app/entrypoint.sh && \
48+
echo ' echo "DB_HOST=$DB_HOST" >> /app/.env' >> /app/entrypoint.sh && \
49+
echo 'fi' >> /app/entrypoint.sh && \
50+
echo 'if [ ! -z "$DB_PORT" ]; then' >> /app/entrypoint.sh && \
51+
echo ' echo "DB_PORT=$DB_PORT" >> /app/.env' >> /app/entrypoint.sh && \
52+
echo 'fi' >> /app/entrypoint.sh && \
53+
echo 'if [ ! -z "$DB_USER" ]; then' >> /app/entrypoint.sh && \
54+
echo ' echo "DB_USER=$DB_USER" >> /app/.env' >> /app/entrypoint.sh && \
55+
echo 'fi' >> /app/entrypoint.sh && \
56+
echo 'if [ ! -z "$DB_PASS" ]; then' >> /app/entrypoint.sh && \
57+
echo ' echo "DB_PASS=$DB_PASS" >> /app/.env' >> /app/entrypoint.sh && \
58+
echo 'fi' >> /app/entrypoint.sh && \
59+
echo 'if [ ! -z "$DB_NAME" ]; then' >> /app/entrypoint.sh && \
60+
echo ' echo "DB_NAME=$DB_NAME" >> /app/.env' >> /app/entrypoint.sh && \
61+
echo 'fi' >> /app/entrypoint.sh && \
62+
echo 'if [ ! -z "$DB_SCHEMA" ]; then' >> /app/entrypoint.sh && \
63+
echo ' echo "DB_SCHEMA=$DB_SCHEMA" >> /app/.env' >> /app/entrypoint.sh && \
64+
echo 'fi' >> /app/entrypoint.sh && \
65+
echo '' >> /app/entrypoint.sh && \
66+
echo '# Start the application' >> /app/entrypoint.sh && \
67+
echo 'exec /app/ip-location-api' >> /app/entrypoint.sh && \
68+
chmod +x /app/entrypoint.sh && \
69+
chown appuser:appuser /app/entrypoint.sh
70+
71+
USER appuser
72+
73+
# Create separate stages for each architecture
74+
FROM runtime AS amd64
75+
COPY --from=builder /app/builds/ip-location-api-linux-x64.bin /app/ip-location-api
76+
77+
FROM runtime AS arm64
78+
COPY --from=builder /app/builds/ip-location-api-linux-arm64.bin /app/ip-location-api
79+
80+
# Use the appropriate image based on architecture
81+
FROM ${TARGETARCH}
82+
83+
# Declare a volume for persisting downloaded data
84+
VOLUME /app/downloads
85+
86+
# Expose the server port (will be overridden by SERVER_PORT env var if set)
87+
EXPOSE 8080
88+
89+
# Set up environment variables with defaults
90+
# These can be overridden when running the container
91+
ENV SERVER_HOST=0.0.0.0
92+
ENV SERVER_PORT=8080
93+
ENV API_KEY=""
94+
ENV COUNTRY="geo-whois-asn-country"
95+
ENV CITY=""
96+
ENV ASN="asn"
97+
ENV UPDATE_TIME="01:30"
98+
ENV LOAD_LOG_FREQ=50000
99+
# DB_TYPE can be mmdb, postgres, mysql, sqlite or :memory:
100+
ENV DB_TYPE="mmdb"
101+
# Database connection variables (used when DB_TYPE is set to postgres/mysql/sqlite)
102+
# ENV DB_HOST=""
103+
# ENV DB_PORT=""
104+
# ENV DB_USER="" # used with sqlite for .db filename
105+
# ENV DB_PASS=""
106+
# ENV DB_NAME=""
107+
# ENV DB_SCHEMA="" # used for postgres/sqlite
108+
109+
110+
# Command to run the entrypoint script that will generate .env and start the app
111+
CMD ["/app/entrypoint.sh"]

Makefile

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,27 @@ all: test build
1515
# Build commands
1616
build: update $(BUILD_COMMAND)
1717

18-
build_other:
18+
build_linux_amd64:
1919
GOARCH=amd64 GOOS=linux go build -o builds/$(BINARY_NAME)-linux-x64.bin .
20+
21+
build_windows_amd64:
2022
GOARCH=amd64 GOOS=windows go build -o builds/$(BINARY_NAME)-windows-x64.exe .
23+
24+
build_darwin_amd64:
2125
GOARCH=amd64 GOOS=darwin go build -o builds/$(BINARY_NAME)-darwin-x64.dmg .
26+
27+
build_linux_arm64:
2228
GOARCH=arm64 GOOS=linux go build -o builds/$(BINARY_NAME)-linux-arm64.bin .
29+
30+
build_windows_arm64:
2331
GOARCH=arm64 GOOS=windows go build -o builds/$(BINARY_NAME)-windows-arm64.exe .
32+
33+
build_darwin_arm64:
2434
GOARCH=arm64 GOOS=darwin go build -o builds/$(BINARY_NAME)-darwin-arm64.dmg .
2535

36+
build_other: build_linux_amd64 build_windows_amd64 build_darwin_amd64
37+
build_other: build_linux_arm64 build_windows_arm64 build_darwin_arm64
38+
2639
build_windows:
2740
set "GOARCH=amd64" && set "GOOS=linux" && go build -o builds\$(BINARY_NAME)-linux-x64.bin .
2841
set "GOARCH=amd64" && set "GOOS=windows" && go build -o builds\$(BINARY_NAME)-windows-x64.exe .
@@ -38,12 +51,12 @@ clean_go:
3851
go clean
3952

4053
clean_other: clean_go
41-
rm builds/$(BINARY_NAME)-linux-x64.bin
42-
rm builds/$(BINARY_NAME)-windows-x64.exe
43-
rm builds/$(BINARY_NAME)-darwin-x64.dmg
44-
rm builds/$(BINARY_NAME)-linux-arm64.bin
45-
rm builds/$(BINARY_NAME)-windows-arm64.exe
46-
rm builds/$(BINARY_NAME)-darwin-arm64.dmg
54+
$(RM) builds/$(BINARY_NAME)-linux-x64.bin
55+
$(RM) builds/$(BINARY_NAME)-windows-x64.exe
56+
$(RM) builds/$(BINARY_NAME)-darwin-x64.dmg
57+
$(RM) builds/$(BINARY_NAME)-linux-arm64.bin
58+
$(RM) builds/$(BINARY_NAME)-windows-arm64.exe
59+
$(RM) builds/$(BINARY_NAME)-darwin-arm64.dmg
4760

4861
clean_windows: clean_go
4962
del "builds\$(BINARY_NAME)-linux-x64.bin"
@@ -68,4 +81,8 @@ test: update
6881
# Update commands
6982
update:
7083
go get -u
71-
go mod tidy
84+
go mod tidy
85+
86+
# Docker commands
87+
dockerbuild:
88+
docker build -t ip-location-api .

README.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ If you wish to expose the system without a reverse proxy, you may wish to update
8787

8888
`API_KEY` allows a very basic protection of the system to be applied, a header named `API-KEY` *(hyphen not underscore!)* with a matching value must be passed if this variable is populated. If left blank, the API is open.
8989

90+
`LOAD_LOG_FREQ` allows adjusting how frequently progress in saving records will be logged.
91+
9092
`COUNTRY`, `CITY` and `ASN` are the databases that will be loaded. **If you don't need cities or ASNs, just leave them blank.** The values / names used should mirror the directory values found in the [ip-location-db](https://github.com/sapics/ip-location-db) project:
9193

9294
### Allowed `COUNTRY` values
@@ -261,10 +263,29 @@ More interestingly, for a single IP, `/benchmark/{ipVersion}/1`:
261263

262264
**1000μs is still only 0.001 seconds, so all are acceptably quick.**
263265

266+
## Docker
267+
268+
There is a Dockerfile included that supports building a docker container image, `ip-location-api`.
269+
This can be built by running `make dockerbuild`.
270+
By default, this uses the `mmdb` data storage, and open data that doesn't require a license:
271+
272+
* `COUNTRY` defaults to `geo-whois-asn-country`
273+
* `CITY` defaults to blank
274+
* `ASN` defaults to `asn`
275+
276+
To run the docker image, map port 8080 to the desired port, and pass the configuration variables on the commandline.
277+
For example, to serve on port 8454, using a sqlite database, with the dbip data for country and ask but geolite2 for city, run:
278+
279+
```Shell
280+
docker run -p 8454:8080 -e DB_TYPE=sqlite -e DB_USER=ip-location-api.db -e COUNTRY=dbip-country -e CITY=geolite2-city -e ASN=dbip-asn ip-location-api
281+
```
282+
283+
To persist location data between starts, pass `-v ip_location_data:/app/downloads` to the `docker run` command.
284+
264285
## Possible Future Improvements / Enhancements
265286

266287
- [ ] Make the webserver optional
267-
- [ ] Add ready to use Docker examples
288+
- [x] Add ready to use Docker examples
268289
- [ ] Return licence info with the API results *(if required)*
269290
- [ ] Improve my sloppy Go code
270291
- [ ] Add proper tests

go.mod

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
module github.com/paul-norman/ip_api
22

3-
go 1.22.5
3+
go 1.23.9
44

55
require (
66
github.com/glebarez/go-sqlite v1.22.0
7-
github.com/go-sql-driver/mysql v1.8.1
7+
github.com/go-sql-driver/mysql v1.9.2
88
github.com/joho/godotenv v1.5.1
99
github.com/lib/pq v1.10.9
1010
github.com/maxmind/mmdbwriter v1.0.0
1111
github.com/oschwald/maxminddb-golang v1.13.1
1212
github.com/praserx/ipconv v1.2.2
13-
github.com/seancfoley/ipaddress-go v1.6.0
14-
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
13+
github.com/seancfoley/ipaddress-go v1.7.1
14+
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6
1515
)
1616

1717
require (
@@ -23,9 +23,9 @@ require (
2323
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
2424
github.com/seancfoley/bintree v1.3.1 // indirect
2525
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
26-
golang.org/x/sys v0.23.0 // indirect
27-
modernc.org/libc v1.56.0 // indirect
28-
modernc.org/mathutil v1.6.0 // indirect
29-
modernc.org/memory v1.8.0 // indirect
30-
modernc.org/sqlite v1.31.1 // indirect
26+
golang.org/x/sys v0.33.0 // indirect
27+
modernc.org/libc v1.65.7 // indirect
28+
modernc.org/mathutil v1.7.1 // indirect
29+
modernc.org/memory v1.11.0 // indirect
30+
modernc.org/sqlite v1.37.0 // indirect
3131
)

go.sum

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
66
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
77
github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ=
88
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
9-
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
10-
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
11-
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
12-
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
9+
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
10+
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
11+
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
12+
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
1313
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
1414
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1515
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
@@ -32,46 +32,46 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
3232
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
3333
github.com/seancfoley/bintree v1.3.1 h1:cqmmQK7Jm4aw8gna0bP+huu5leVOgHGSJBEpUx3EXGI=
3434
github.com/seancfoley/bintree v1.3.1/go.mod h1:hIUabL8OFYyFVTQ6azeajbopogQc2l5C/hiXMcemWNU=
35-
github.com/seancfoley/ipaddress-go v1.6.0 h1:9z7yGmOnV4P2ML/dlR/kCJiv5tp8iHOOetJvxJh/R5w=
36-
github.com/seancfoley/ipaddress-go v1.6.0/go.mod h1:TQRZgv+9jdvzHmKoPGBMxyiaVmoI0rYpfEk8Q/sL/Iw=
35+
github.com/seancfoley/ipaddress-go v1.7.1 h1:fDWryS+L8iaaH5RxIKbY0xB5Z+Zxk8xoXLN4S4eAPdQ=
36+
github.com/seancfoley/ipaddress-go v1.7.1/go.mod h1:TQRZgv+9jdvzHmKoPGBMxyiaVmoI0rYpfEk8Q/sL/Iw=
3737
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
3838
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
3939
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
4040
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
41-
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
42-
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
43-
golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
44-
golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
45-
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
46-
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
41+
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
42+
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
43+
golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
44+
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
45+
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
46+
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
4747
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
48-
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
49-
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
50-
golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
51-
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
48+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
49+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
50+
golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
51+
golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
5252
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
5353
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
54-
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
55-
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
56-
modernc.org/ccgo/v4 v4.20.6 h1:Df/8U75vr6+vqYyBCSGXinSbkl/0iLjWEIYGYgYhJOk=
57-
modernc.org/ccgo/v4 v4.20.6/go.mod h1:mL6ov9HLsSs3WlPorlPuWFO5u9+xVNTqW72uClt3pRI=
58-
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
59-
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
60-
modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M=
61-
modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
62-
modernc.org/libc v1.56.0 h1:O9Xq2c2MnP1bU69vbPX5jHQyQfElMprUR94GlBljRaw=
63-
modernc.org/libc v1.56.0/go.mod h1:s9jnOo7LcO1G9+nGj4GY/+Fj8+teenJoC/WfVxnSd+M=
64-
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
65-
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
66-
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
67-
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
68-
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
69-
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
70-
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
71-
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
72-
modernc.org/sqlite v1.31.1 h1:XVU0VyzxrYHlBhIs1DiEgSl0ZtdnPtbLVy8hSkzxGrs=
73-
modernc.org/sqlite v1.31.1/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA=
74-
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
75-
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
54+
modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s=
55+
modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
56+
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
57+
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
58+
modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8=
59+
modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
60+
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
61+
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
62+
modernc.org/libc v1.65.7 h1:Ia9Z4yzZtWNtUIuiPuQ7Qf7kxYrxP1/jeHZzG8bFu00=
63+
modernc.org/libc v1.65.7/go.mod h1:011EQibzzio/VX3ygj1qGFt5kMjP0lHb0qCW5/D/pQU=
64+
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
65+
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
66+
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
67+
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
68+
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
69+
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
70+
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
71+
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
72+
modernc.org/sqlite v1.37.0 h1:s1TMe7T3Q3ovQiK2Ouz4Jwh7dw4ZDqbebSDTlSJdfjI=
73+
modernc.org/sqlite v1.37.0/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM=
74+
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
75+
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
7676
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
7777
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

0 commit comments

Comments
 (0)