| # 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"), |
| ], |
| ), |
| }, |
| ) |