|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // Copyright 2011 Xing Xing <mikespook@gmail.com> All rights reserved.
- // Use of this source code is governed by a MIT
- // license that can be found in the LICENSE file.
-
- package worker
-
- import (
- gearman "bitbucket.org/mikespook/gearman-go"
- "strconv"
- )
-
- // Worker side job
- type WorkerJob struct {
- Data []byte
- Handle, UniqueId string
- agent *jobAgent
- magicCode, DataType uint32
- }
-
- // Create a new job
- func NewWorkerJob(magiccode, datatype uint32, data []byte) (job *WorkerJob) {
- return &WorkerJob{magicCode: magiccode,
- DataType: datatype,
- Data: data}
- }
-
- // Decode job from byte slice
- func DecodeWorkerJob(data []byte) (job *WorkerJob, err error) {
- if len(data) < 12 {
- err = gearman.ErrInvalidData
- return
- }
- datatype := gearman.BytesToUint32([4]byte{data[4], data[5], data[6], data[7]})
- l := gearman.BytesToUint32([4]byte{data[8], data[9], data[10], data[11]})
- if len(data[12:]) != int(l) {
- err = gearman.ErrInvalidData
- return
- }
- data = data[12:]
- job = NewWorkerJob(gearman.RES, datatype, data)
- return
- }
-
- // Encode a job to byte slice
- func (job *WorkerJob) Encode() (data []byte) {
- magiccode := gearman.Uint32ToBytes(job.magicCode)
- datatype := gearman.Uint32ToBytes(job.DataType)
- data = make([]byte, 0, 1024*64)
- data = append(data, magiccode[:]...)
- data = append(data, datatype[:]...)
- data = append(data, []byte{0, 0, 0, 0}...)
- l := len(job.Data)
- if job.Handle != "" {
- data = append(data, []byte(job.Handle)...)
- data = append(data, 0)
- l += len(job.Handle) + 1
- }
- data = append(data, job.Data...)
- datalength := gearman.Uint32ToBytes(uint32(l))
- copy(data[8:12], datalength[:])
- return
- }
-
- // Send some datas to client.
- // Using this in a job's executing.
- func (job *WorkerJob) UpdateData(data []byte, iswaring bool) (err error) {
- result := append([]byte(job.Handle), 0)
- result = append(result, data...)
- var datatype uint32
- if iswaring {
- datatype = gearman.WORK_WARNING
- } else {
- datatype = gearman.WORK_DATA
- }
- return job.agent.WriteJob(NewWorkerJob(gearman.REQ, datatype, result))
- }
-
- // Update status.
- // Tall client how many percent job has been executed.
- func (job *WorkerJob) UpdateStatus(numerator, denominator int) (err error) {
- n := []byte(strconv.Itoa(numerator))
- d := []byte(strconv.Itoa(denominator))
- result := append([]byte(job.Handle), 0)
- result = append(result, n...)
- result = append(result, d...)
- return job.agent.WriteJob(NewWorkerJob(gearman.REQ, gearman.WORK_STATUS, result))
- }
|