github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/show/show.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/14 shanxia 3 4 package main 5 6 import ( 7 "fmt" 8 "os" 9 10 "github.com/unirita/cuto/console" 11 "github.com/unirita/cuto/db" 12 "github.com/unirita/cuto/db/query" 13 "github.com/unirita/cuto/show/gen" 14 "github.com/unirita/cuto/utctime" 15 ) 16 17 // 表示に使用する構造体。 18 type ShowParam struct { 19 nid int // インスタンスID 20 jobnetName string // ジョブネットワーク名 21 from string // FROM日付 22 to string // TO日付 23 status int // ステータス 24 gen gen.Generator // 出力ジェネレーター 25 conn db.IConnection // DBコネクション 26 } 27 28 // ジョブネットワークのインスタンス毎の表示用構造体 29 type oneJobnetwork struct { 30 jobnet *db.JobNetworkResult // ジョブネットワーク情報 31 jobs []*db.JobResult // ジョブネットワークに所属するジョブ情報一覧 32 } 33 34 // ShowParam構造体のコンストラクタ。 35 func NewShowParam(nid int, jobnetName string, from string, to string, status int, gen gen.Generator) *ShowParam { 36 return &ShowParam{ 37 nid: nid, 38 jobnetName: jobnetName, 39 from: from, 40 to: to, 41 status: status, 42 gen: gen, 43 } 44 } 45 46 // ユーティリティ実行のメインルーチン 47 // 成功した場合は、出力したジョブネットワークの件数を返します。 48 func (s *ShowParam) Run(db_name string, isOutputUTC bool) (int, error) { 49 conn, err := db.Open(db_name) 50 if err != nil { 51 return 0, err 52 } 53 defer conn.Close() 54 s.conn = conn 55 56 // ジョブネットワーク情報の取得 57 netResults, err := s.getJobnetworkList() 58 if err != nil { 59 return 0, err 60 } else if len(netResults) == 0 { 61 return 0, nil 62 } 63 // 取得したジョブネットワークインスタンス毎に、ジョブを出力する。 64 var out gen.OutputRoot 65 for _, jobnet := range netResults { 66 oneJobnet := &oneJobnetwork{jobnet: jobnet} 67 err := oneJobnet.getJobList(s.conn) 68 if err != nil { // ジョブネットワーク内のジョブ取得に失敗したが、ジョブネットワークだけでも出力する。 69 console.DisplayError("CTU005W", oneJobnet.jobnet.ID, err) 70 } 71 out.Jobnetworks = append(out.Jobnetworks, oneJobnet.setOutputStructure(isOutputUTC)) 72 } 73 // ジェネレーターで出力メッセージ作成。 74 msg, err := s.gen.Generate(&out) 75 if err != nil { 76 return 0, err 77 } 78 fmt.Fprint(os.Stdout, msg) 79 return len(netResults), nil 80 } 81 82 // ジョブネットワーク一覧の取得 83 func (s *ShowParam) getJobnetworkList() ([]*db.JobNetworkResult, error) { 84 jnQ := query.CreateJobnetworkQuery(s.conn) 85 if s.nid > 0 { 86 jnQ.AddAndWhereID(s.nid) 87 } 88 if len(s.jobnetName) > 0 { 89 jnQ.AddAndWhereJobnetwork(s.jobnetName) 90 } 91 if len(s.from) > 0 { 92 jnQ.AddAndWhereMoreThanStartdate(s.from) 93 } 94 if len(s.to) > 0 { 95 jnQ.AddAndWhereLessThanStartdate(s.to) 96 } 97 if s.status != -1 { 98 jnQ.AddAndWhereStatus(s.status) 99 } 100 jnQ.AddOrderBy(query.ORDERBY_ASC) 101 netResults, err := jnQ.GetJobnetworkList() 102 if err != nil { 103 return nil, err 104 } 105 return netResults, nil 106 } 107 108 // ジョブネットワークに所属するジョブ情報一覧を取得 109 func (o *oneJobnetwork) getJobList(conn db.IConnection) error { 110 var err error 111 o.jobs, err = query.GetJobsOfTargetNetwork(conn, o.jobnet.ID, query.ORDERBY_ASC) 112 if err != nil { 113 return err 114 } 115 return nil 116 } 117 118 // 出力ジェネレータ構造体への格納 119 func (o *oneJobnetwork) setOutputStructure(isOutputUTC bool) *gen.OutputJobNet { 120 jobNet := &gen.OutputJobNet{ 121 Id: o.jobnet.ID, 122 Jobnetwork: o.jobnet.JobnetWork, 123 StartDate: correctTimezone(o.jobnet.StartDate, isOutputUTC), 124 EndDate: correctTimezone(o.jobnet.EndDate, isOutputUTC), 125 Status: o.jobnet.Status, 126 Detail: o.jobnet.Detail, 127 CreateDate: correctTimezone(o.jobnet.CreateDate, isOutputUTC), 128 UpdateDate: correctTimezone(o.jobnet.UpdateDate, isOutputUTC), 129 } 130 for _, job := range o.jobs { 131 j := &gen.OutputJob{ 132 JobId: job.JobId, 133 Jobname: job.JobName, 134 StartDate: correctTimezone(job.StartDate, isOutputUTC), 135 EndDate: correctTimezone(job.EndDate, isOutputUTC), 136 Status: job.Status, 137 Detail: job.Detail, 138 Rc: job.Rc, 139 Node: job.Node, 140 Port: job.Port, 141 Variable: job.Variable, 142 CreateDate: correctTimezone(job.CreateDate, isOutputUTC), 143 UpdateDate: correctTimezone(job.UpdateDate, isOutputUTC), 144 } 145 jobNet.Jobs = append(jobNet.Jobs, j) 146 } 147 return jobNet 148 } 149 150 func correctTimezone(utcStr string, isOutputUTC bool) string { 151 if isOutputUTC { 152 return utcStr 153 } 154 t, err := utctime.Parse(utctime.Default, utcStr) 155 if err != nil { 156 return utcStr 157 } 158 return t.FormatLocaltime(utctime.Default) 159 }