Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

82 řádky
2.1 KiB

  1. package gearman
  2. import (
  3. "os"
  4. // "log"
  5. )
  6. type WorkerJob struct {
  7. Data []byte
  8. Handle string
  9. UniqueId string
  10. client *jobClient
  11. magicCode, dataType uint32
  12. Job
  13. }
  14. func NewWorkerJob(magiccode, datatype uint32, data []byte) (job *WorkerJob) {
  15. return &WorkerJob{magicCode:magiccode,
  16. dataType: datatype,
  17. Data:data}
  18. }
  19. func DecodeWorkerJob(data []byte) (job *WorkerJob, err os.Error) {
  20. if len(data) < 12 {
  21. err = os.NewError("Data length is too small.")
  22. return
  23. }
  24. datatype := byteToUint32([4]byte{data[4], data[5], data[6], data[7]})
  25. l := byteToUint32([4]byte{data[8], data[9], data[10], data[11]})
  26. if len(data[12:]) != int(l) {
  27. err = os.NewError("Invalid data length.")
  28. return
  29. }
  30. data = data[12:]
  31. job = NewWorkerJob(RES, datatype, data)
  32. return
  33. }
  34. func (job *WorkerJob) Encode() (data []byte) {
  35. magiccode := uint32ToByte(job.magicCode)
  36. datatype := uint32ToByte(job.dataType)
  37. data = make([]byte, 0, 1024 * 64)
  38. data = append(data, magiccode[:] ...)
  39. data = append(data, datatype[:] ...)
  40. data = append(data, []byte{0, 0, 0, 0} ...)
  41. l := len(job.Data)
  42. if job.Handle != "" {
  43. data = append(data, []byte(job.Handle) ...)
  44. data = append(data, 0)
  45. l += len(job.Handle) + 1
  46. }
  47. data = append(data, job.Data ...)
  48. datalength := uint32ToByte(uint32(l))
  49. copy(data[8:12], datalength[:])
  50. return
  51. }
  52. // update data
  53. func (job * WorkerJob) UpdateData(data []byte, iswaring bool) (err os.Error) {
  54. result := append([]byte(job.Handle), 0)
  55. result = append(result, data ...)
  56. var datatype uint32
  57. if iswaring {
  58. datatype = WORK_WARNING
  59. } else {
  60. datatype = WORK_DATA
  61. }
  62. return job.client.WriteJob(NewWorkerJob(REQ, datatype, result))
  63. }
  64. // update status
  65. func (job * WorkerJob) UpdateStatus(numerator, denominator uint32) (err os.Error) {
  66. n := uint32ToByte(numerator)
  67. d := uint32ToByte(denominator)
  68. result := append([]byte(job.Handle), 0)
  69. result = append(result, n[:] ...)
  70. result = append(result, d[:] ...)
  71. return job.client.WriteJob(NewWorkerJob(REQ, WORK_STATUS, result))
  72. }