53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
package replication
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/omniscale/imposm3/update/state"
|
|
)
|
|
|
|
func NewDiffDownloader(dest, url string, seq int, interval time.Duration) *downloader {
|
|
dl := newDownloader(dest, url, seq, interval)
|
|
dl.fileExt = ".osc.gz"
|
|
dl.stateExt = ".state.txt"
|
|
dl.stateTime = parseTxtTime
|
|
go dl.fetchNextLoop()
|
|
return dl
|
|
}
|
|
|
|
func CurrentDiff(url string) (int, error) {
|
|
resp, err := http.Get(url + "state.txt")
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if resp.StatusCode != 200 {
|
|
return 0, errors.New(fmt.Sprintf("invalid repsonse: %v", resp))
|
|
}
|
|
defer resp.Body.Close()
|
|
s, err := state.Parse(resp.Body)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return s.Sequence, nil
|
|
}
|
|
|
|
func parseTxtTime(filename string) (time.Time, error) {
|
|
ds, err := state.ParseFile(filename)
|
|
if err != nil {
|
|
return time.Time{}, err
|
|
}
|
|
return ds.Time, nil
|
|
}
|
|
|
|
func NewDiffReader(dest string, seq int) *reader {
|
|
r := newReader(dest, seq)
|
|
r.fileExt = ".osc.gz"
|
|
r.stateExt = ".state.txt"
|
|
r.stateTime = parseTxtTime
|
|
go r.fetchNextLoop()
|
|
return r
|
|
}
|