172 lines
4.8 KiB
Go
172 lines
4.8 KiB
Go
// Copyright 2019 Drone IO, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package build
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
|
|
"github.com/drone/drone/core"
|
|
"github.com/drone/drone/store/shared/db"
|
|
|
|
"github.com/jmoiron/sqlx/types"
|
|
)
|
|
|
|
// helper function converts the Build structure to a set
|
|
// of named query parameters.
|
|
func toParams(build *core.Build) map[string]interface{} {
|
|
return map[string]interface{}{
|
|
"build_id": build.ID,
|
|
"build_repo_id": build.RepoID,
|
|
"build_trigger": build.Trigger,
|
|
"build_number": build.Number,
|
|
"build_parent": build.Parent,
|
|
"build_status": build.Status,
|
|
"build_error": build.Error,
|
|
"build_event": build.Event,
|
|
"build_action": build.Action,
|
|
"build_link": build.Link,
|
|
"build_timestamp": build.Timestamp,
|
|
"build_title": build.Title,
|
|
"build_message": build.Message,
|
|
"build_before": build.Before,
|
|
"build_after": build.After,
|
|
"build_ref": build.Ref,
|
|
"build_source_repo": build.Fork,
|
|
"build_source": build.Source,
|
|
"build_target": build.Target,
|
|
"build_author": build.Author,
|
|
"build_author_name": build.AuthorName,
|
|
"build_author_email": build.AuthorEmail,
|
|
"build_author_avatar": build.AuthorAvatar,
|
|
"build_sender": build.Sender,
|
|
"build_params": encodeParams(build.Params),
|
|
"build_cron": build.Cron,
|
|
"build_deploy": build.Deploy,
|
|
"build_deploy_id": build.DeployID,
|
|
"build_debug": build.Debug,
|
|
"build_started": build.Started,
|
|
"build_finished": build.Finished,
|
|
"build_created": build.Created,
|
|
"build_updated": build.Updated,
|
|
"build_version": build.Version,
|
|
}
|
|
}
|
|
|
|
// helper function converts the Stage structure to a set
|
|
// of named query parameters.
|
|
func toStageParams(stage *core.Stage) map[string]interface{} {
|
|
return map[string]interface{}{
|
|
"stage_id": stage.ID,
|
|
"stage_repo_id": stage.RepoID,
|
|
"stage_build_id": stage.BuildID,
|
|
"stage_number": stage.Number,
|
|
"stage_name": stage.Name,
|
|
"stage_kind": stage.Kind,
|
|
"stage_type": stage.Type,
|
|
"stage_status": stage.Status,
|
|
"stage_error": stage.Error,
|
|
"stage_errignore": stage.ErrIgnore,
|
|
"stage_exit_code": stage.ExitCode,
|
|
"stage_limit": stage.Limit,
|
|
"stage_limit_repo": stage.LimitRepo,
|
|
"stage_os": stage.OS,
|
|
"stage_arch": stage.Arch,
|
|
"stage_variant": stage.Variant,
|
|
"stage_kernel": stage.Kernel,
|
|
"stage_machine": stage.Machine,
|
|
"stage_started": stage.Started,
|
|
"stage_stopped": stage.Stopped,
|
|
"stage_created": stage.Created,
|
|
"stage_updated": stage.Updated,
|
|
"stage_version": stage.Version,
|
|
"stage_on_success": stage.OnSuccess,
|
|
"stage_on_failure": stage.OnFailure,
|
|
"stage_depends_on": encodeSlice(stage.DependsOn),
|
|
"stage_labels": encodeParams(stage.Labels),
|
|
}
|
|
}
|
|
|
|
func encodeParams(v map[string]string) types.JSONText {
|
|
raw, _ := json.Marshal(v)
|
|
return types.JSONText(raw)
|
|
}
|
|
|
|
func encodeSlice(v []string) types.JSONText {
|
|
raw, _ := json.Marshal(v)
|
|
return types.JSONText(raw)
|
|
}
|
|
|
|
// helper function scans the sql.Row and copies the column
|
|
// values to the destination object.
|
|
func scanRow(scanner db.Scanner, dest *core.Build) error {
|
|
paramsJSON := types.JSONText{}
|
|
err := scanner.Scan(
|
|
&dest.ID,
|
|
&dest.RepoID,
|
|
&dest.Trigger,
|
|
&dest.Number,
|
|
&dest.Parent,
|
|
&dest.Status,
|
|
&dest.Error,
|
|
&dest.Event,
|
|
&dest.Action,
|
|
&dest.Link,
|
|
&dest.Timestamp,
|
|
&dest.Title,
|
|
&dest.Message,
|
|
&dest.Before,
|
|
&dest.After,
|
|
&dest.Ref,
|
|
&dest.Fork,
|
|
&dest.Source,
|
|
&dest.Target,
|
|
&dest.Author,
|
|
&dest.AuthorName,
|
|
&dest.AuthorEmail,
|
|
&dest.AuthorAvatar,
|
|
&dest.Sender,
|
|
¶msJSON,
|
|
&dest.Cron,
|
|
&dest.Deploy,
|
|
&dest.DeployID,
|
|
&dest.Debug,
|
|
&dest.Started,
|
|
&dest.Finished,
|
|
&dest.Created,
|
|
&dest.Updated,
|
|
&dest.Version,
|
|
)
|
|
dest.Params = map[string]string{}
|
|
json.Unmarshal(paramsJSON, &dest.Params)
|
|
return err
|
|
}
|
|
|
|
// helper function scans the sql.Row and copies the column
|
|
// values to the destination object.
|
|
func scanRows(rows *sql.Rows) ([]*core.Build, error) {
|
|
defer rows.Close()
|
|
|
|
builds := []*core.Build{}
|
|
for rows.Next() {
|
|
build := new(core.Build)
|
|
err := scanRow(rows, build)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
builds = append(builds, build)
|
|
}
|
|
return builds, nil
|
|
}
|