refactor(daemon): switch to gob encoding
This commit is contained in:
		
							
								
								
									
										84
									
								
								api/api.go
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								api/api.go
									
									
									
									
									
								
							| @@ -1,7 +1,8 @@ | |||||||
| package api | package api | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"bytes" | ||||||
|  | 	"encoding/gob" | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net" | 	"net" | ||||||
| @@ -11,9 +12,7 @@ import ( | |||||||
| 	"code.dumpstack.io/tools/out-of-tree/artifact" | 	"code.dumpstack.io/tools/out-of-tree/artifact" | ||||||
| 	"code.dumpstack.io/tools/out-of-tree/distro" | 	"code.dumpstack.io/tools/out-of-tree/distro" | ||||||
|  |  | ||||||
| 	"github.com/davecgh/go-spew/spew" |  | ||||||
| 	"github.com/google/uuid" | 	"github.com/google/uuid" | ||||||
| 	"github.com/rs/zerolog/log" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ErrInvalid = errors.New("") | var ErrInvalid = errors.New("") | ||||||
| @@ -106,9 +105,12 @@ type Req struct { | |||||||
| 	Data []byte | 	Data []byte | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Req) SetData(data any) { | func (r *Req) SetData(data any) (err error) { | ||||||
| 	r.Type = fmt.Sprintf("%v", reflect.TypeOf(data)) | 	r.Type = fmt.Sprintf("%v", reflect.TypeOf(data)) | ||||||
| 	r.Data = Marshal(data) | 	var buf bytes.Buffer | ||||||
|  | 	err = gob.NewEncoder(&buf).Encode(data) | ||||||
|  | 	r.Data = buf.Bytes() | ||||||
|  | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Req) GetData(data any) (err error) { | func (r *Req) GetData(data any) (err error) { | ||||||
| @@ -122,32 +124,16 @@ func (r *Req) GetData(data any) (err error) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	log.Trace().Msgf("unmarshal %v", string(r.Data)) | 	buf := bytes.NewBuffer(r.Data) | ||||||
| 	err = json.Unmarshal(r.Data, &data) | 	return gob.NewDecoder(buf).Decode(data) | ||||||
| 	return |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r Req) Encode(conn net.Conn) { | func (r *Req) Encode(conn net.Conn) (err error) { | ||||||
| 	log.Debug().Msgf("encode %v", r.Command) | 	return gob.NewEncoder(conn).Encode(r) | ||||||
| 	err := json.NewEncoder(conn).Encode(&r) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal().Msgf("encode %v", r.Command) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Req) Decode(conn net.Conn) (err error) { | func (r *Req) Decode(conn net.Conn) (err error) { | ||||||
| 	err = json.NewDecoder(conn).Decode(r) | 	return gob.NewDecoder(conn).Decode(r) | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r Req) Marshal() (bytes []byte) { |  | ||||||
| 	return Marshal(r) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (Req) Unmarshal(data []byte) (r Req, err error) { |  | ||||||
| 	err = json.Unmarshal(data, &r) |  | ||||||
| 	log.Trace().Msgf("unmarshal %v", spew.Sdump(r)) |  | ||||||
| 	return |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type Resp struct { | type Resp struct { | ||||||
| @@ -166,9 +152,12 @@ func NewResp() (resp Resp) { | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Resp) SetData(data any) { | func (r *Resp) SetData(data any) (err error) { | ||||||
| 	r.Type = fmt.Sprintf("%v", reflect.TypeOf(data)) | 	r.Type = fmt.Sprintf("%v", reflect.TypeOf(data)) | ||||||
| 	r.Data = Marshal(data) | 	var buf bytes.Buffer | ||||||
|  | 	err = gob.NewEncoder(&buf).Encode(data) | ||||||
|  | 	r.Data = buf.Bytes() | ||||||
|  | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Resp) GetData(data any) (err error) { | func (r *Resp) GetData(data any) (err error) { | ||||||
| @@ -182,48 +171,19 @@ func (r *Resp) GetData(data any) (err error) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	log.Trace().Msgf("unmarshal %v", string(r.Data)) | 	buf := bytes.NewBuffer(r.Data) | ||||||
| 	err = json.Unmarshal(r.Data, &data) | 	return gob.NewDecoder(buf).Decode(data) | ||||||
| 	return |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Resp) Encode(conn net.Conn) { | func (r *Resp) Encode(conn net.Conn) (err error) { | ||||||
| 	if r.Err != nil && r.Err != ErrInvalid && r.Error == "" { | 	if r.Err != nil && r.Err != ErrInvalid && r.Error == "" { | ||||||
| 		r.Error = fmt.Sprintf("%v", r.Err) | 		r.Error = fmt.Sprintf("%v", r.Err) | ||||||
| 	} | 	} | ||||||
| 	log.Debug().Msgf("encode %v", r.UUID) | 	return gob.NewEncoder(conn).Encode(r) | ||||||
| 	err := json.NewEncoder(conn).Encode(r) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal().Msgf("encode %v", r.UUID) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Resp) Decode(conn net.Conn) (err error) { | func (r *Resp) Decode(conn net.Conn) (err error) { | ||||||
| 	err = json.NewDecoder(conn).Decode(r) | 	err = gob.NewDecoder(conn).Decode(r) | ||||||
| 	r.Err = ErrInvalid | 	r.Err = ErrInvalid | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *Resp) Marshal() (bytes []byte) { |  | ||||||
| 	if r.Err != nil && r.Err != ErrInvalid && r.Error == "" { |  | ||||||
| 		r.Error = fmt.Sprintf("%v", r.Err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return Marshal(r) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (Resp) Unmarshal(data []byte) (r Resp, err error) { |  | ||||||
| 	err = json.Unmarshal(data, &r) |  | ||||||
| 	log.Trace().Msgf("unmarshal %v", spew.Sdump(r)) |  | ||||||
| 	r.Err = ErrInvalid |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func Marshal(data any) (bytes []byte) { |  | ||||||
| 	bytes, err := json.Marshal(data) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal().Err(err).Msgf("marshal %v", data) |  | ||||||
| 	} |  | ||||||
| 	log.Trace().Msgf("marshal %v", string(bytes)) |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,49 +0,0 @@ | |||||||
| package api |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func TestReq(t *testing.T) { |  | ||||||
| 	req := Req{} |  | ||||||
|  |  | ||||||
| 	req.Command = ListRepos |  | ||||||
| 	req.SetData(&Job{ID: 999, RepoName: "test"}) |  | ||||||
|  |  | ||||||
| 	bytes := req.Marshal() |  | ||||||
|  |  | ||||||
| 	req2, err := Req{}.Unmarshal(bytes) |  | ||||||
| 	assert.Nil(t, err) |  | ||||||
|  |  | ||||||
| 	assert.Equal(t, req, req2) |  | ||||||
|  |  | ||||||
| 	job := Job{} |  | ||||||
| 	err = req2.GetData(&job) |  | ||||||
| 	assert.Nil(t, err) |  | ||||||
|  |  | ||||||
| 	assert.Equal(t, req2.Type, "*api.Job") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestResp(t *testing.T) { |  | ||||||
| 	resp := Resp{} |  | ||||||
|  |  | ||||||
| 	resp.Error = "abracadabra" |  | ||||||
| 	resp.SetData(&[]Repo{{}, {}}) |  | ||||||
|  |  | ||||||
| 	bytes := resp.Marshal() |  | ||||||
|  |  | ||||||
| 	resp2, err := Resp{}.Unmarshal(bytes) |  | ||||||
| 	assert.Nil(t, err) |  | ||||||
|  |  | ||||||
| 	resp2.Err = nil // non-marshallable |  | ||||||
|  |  | ||||||
| 	assert.Equal(t, resp, resp2) |  | ||||||
|  |  | ||||||
| 	var repos []Repo |  | ||||||
| 	err = resp2.GetData(&repos) |  | ||||||
| 	assert.Nil(t, err) |  | ||||||
|  |  | ||||||
| 	assert.Equal(t, resp2.Type, "*[]api.Repo") |  | ||||||
| } |  | ||||||
| @@ -1,8 +1,9 @@ | |||||||
| package db | package db | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"bytes" | ||||||
| 	"database/sql" | 	"database/sql" | ||||||
| 	"encoding/json" | 	"encoding/gob" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"code.dumpstack.io/tools/out-of-tree/api" | 	"code.dumpstack.io/tools/out-of-tree/api" | ||||||
| @@ -37,8 +38,19 @@ func AddJob(db *sql.DB, job *api.Job) (err error) { | |||||||
|  |  | ||||||
| 	defer stmt.Close() | 	defer stmt.Close() | ||||||
|  |  | ||||||
| 	config := api.Marshal(job.Artifact) | 	var abuf bytes.Buffer | ||||||
| 	target := api.Marshal(job.Target) | 	err = gob.NewEncoder(&abuf).Encode(job.Artifact) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	config := abuf.Bytes() | ||||||
|  |  | ||||||
|  | 	var tbuf bytes.Buffer | ||||||
|  | 	err = gob.NewEncoder(&tbuf).Encode(job.Target) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	target := tbuf.Bytes() | ||||||
|  |  | ||||||
| 	res, err := stmt.Exec(time.Now().Unix(), job.UUID, job.Group, | 	res, err := stmt.Exec(time.Now().Unix(), job.UUID, job.Group, | ||||||
| 		job.RepoName, job.Commit, config, target, | 		job.RepoName, job.Commit, config, target, | ||||||
| @@ -65,8 +77,19 @@ func UpdateJob(db *sql.DB, job *api.Job) (err error) { | |||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer stmt.Close() | ||||||
|  |  | ||||||
| 	config := api.Marshal(job.Artifact) | 	var abuf bytes.Buffer | ||||||
| 	target := api.Marshal(job.Target) | 	err = gob.NewEncoder(&abuf).Encode(job.Artifact) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	config := abuf.Bytes() | ||||||
|  |  | ||||||
|  | 	var tbuf bytes.Buffer | ||||||
|  | 	err = gob.NewEncoder(&tbuf).Encode(job.Target) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	target := tbuf.Bytes() | ||||||
|  |  | ||||||
| 	_, err = stmt.Exec(time.Now().Unix(), job.UUID, job.Group, | 	_, err = stmt.Exec(time.Now().Unix(), job.UUID, job.Group, | ||||||
| 		job.RepoName, job.Commit, | 		job.RepoName, job.Commit, | ||||||
| @@ -86,12 +109,14 @@ func scanJob(scan func(dest ...any) error) (job api.Job, err error) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = json.Unmarshal(config, &job.Artifact) | 	abuf := bytes.NewBuffer(config) | ||||||
|  | 	err = gob.NewDecoder(abuf).Decode(&job.Artifact) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = json.Unmarshal(target, &job.Target) | 	tbuf := bytes.NewBuffer(target) | ||||||
|  | 	err = gob.NewDecoder(tbuf).Decode(&job.Target) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user