blob: 602c73c179e03e26df06a3bb6c8d8d4670df9ddf [file] [log] [blame]
# Copyright 2020 The Monogon Project Authors.
#
# SPDX-License-Identifier: Apache-2.0
#
# 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.
load("@bazel_gazelle//:deps.bzl", "go_repository")
load(
"@io_bazel_rules_go//go/private:rules/rule.bzl",
"go_rule",
)
load(
"@io_bazel_rules_go//go:def.bzl",
"GoLibrary",
"go_context",
)
# Default files generated by the sqlboiler + cockroach module
SQLBOILER_FILES = [
"boil_main_test.go",
"boil_queries.go",
"boil_queries_test.go",
"boil_suites_test.go",
"boil_table_names.go",
"boil_types.go",
"crdb_main_test.go",
"crdb_suites_test.go",
"crdb_upsert.go",
]
def _sqlboiler_impl(ctx):
"""Generate sqlboiler models from sql-migrate migrations"""
filesn = []
filesn += SQLBOILER_FILES
for table in ctx.attr.tables:
filesn += [
"{}.go".format(table),
"{}_test.go".format(table),
]
outs = []
for file in filesn:
outs += [ctx.actions.declare_file(file)]
# run_shell does not so set -euo pipefail
command = "set -euo pipefail\n"
# Create random db name
command += "TMP_DB=$(cat /dev/urandom | tr -dc 'a-z' | fold -w 12 | head -n 1 ; echo)\n"
command += "echo DB name: $TMP_DB\n"
# Create DB and template configs
command += "/usr/bin/psql --host localhost --port 26257 --user root -c \"CREATE DATABASE $TMP_DB;\"\n"
command += "ln -s \"{}\" . \n".format(ctx.file.migrate_config.path)
command += "sed -i \"s/_dbname_/$TMP_DB/g\" \"{}\" \n".format(ctx.file.migrate_config.basename)
command += "ln -s {} . \n".format(ctx.file.boiler_config.path)
command += "sed -i \"s/_dbname_/$TMP_DB/g\" \"{}\" \n".format(ctx.file.boiler_config.basename)
# Copy in all sql files
command += "mkdir migrations\n"
for f in ctx.files.srcs:
command += "cp \"{}\" migrations/\n".format(f.path)
# Copy in adapter
command += "cp \"{}\" .\n".format(ctx.file.adapter.path)
# Apply sql-migrate
command += "{} up --config \"{}\" \n".format(ctx.file.migrate.path, ctx.file.migrate_config.basename)
# Run sqlboiler
command += "{} --output \"{}\" --config \"{}\" --wipe crdb \n".format(
ctx.file.boiler.path,
outs[0].dirname,
ctx.file.boiler_config.basename,
)
ctx.actions.run_shell(
inputs = ctx.files.srcs + [
ctx.file.migrate_config,
ctx.file.boiler,
ctx.file.adapter,
ctx.file.migrate,
ctx.file.boiler_config,
],
outputs = outs,
command = command,
)
return [DefaultInfo(files = depset(outs))]
sqlboiler = rule(
implementation = _sqlboiler_impl,
attrs = {
"srcs": attr.label_list(mandatory = True, allow_files = [".sql"]),
"tables": attr.string_list(default = []),
"migrate_config": attr.label(allow_single_file = True, default = Label("@//build/sqlboiler:dbconfig.yml")),
"boiler_config": attr.label(allow_single_file = True, default = Label("@//build/sqlboiler:sqlboiler.toml")),
"boiler": attr.label(allow_single_file = True, default = Label("@com_github_volatiletech_sqlboiler//:sqlboiler")),
"adapter": attr.label(allow_single_file = True, default = Label("@com_github_glerchundi_sqlboiler_crdb//:sqlboiler-crdb")),
"migrate": attr.label(allow_single_file = True, default = Label("@com_github_rubenv_sql_migrate//sql-migrate:sql-migrate")),
},
)
def _sqlboiler_go_impl(ctx):
go = go_context(ctx)
source_files = []
# Don't include test files as they cannot be processed by go_library
for file in ctx.attr.sqlboiler.files.to_list():
if not "test" in file.path:
source_files += [file]
library = go.new_library(
go,
srcs = source_files,
)
source = go.library_to_source(go, ctx.attr, library, False)
providers = [library, source]
output_groups = {
"go_generated_srcs": source_files,
}
return providers + [OutputGroupInfo(**output_groups)]
go_sqlboiler_library = go_rule(
_sqlboiler_go_impl,
attrs = {
"sqlboiler": attr.label(providers = [DefaultInfo]),
"importpath": attr.string(),
"deps": attr.label_list(
providers = [GoLibrary],
default = [
Label("@com_github_friendsofgo_errors//:go_default_library"),
Label("@com_github_lib_pq//:go_default_library"),
Label("@com_github_pkg_errors//:go_default_library"),
Label("@com_github_spf13_viper//:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//boil:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//drivers:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//queries:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//queries/qm:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//randomize:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//strmangle:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//types:go_default_library"),
Label("@com_github_volatiletech_sqlboiler//queries/qmhelper:go_default_library"),
],
),
},
)