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  }