require "sequel" cfg_internal = IniConfig.new() $DDB = Sequel.connect(cfg_internal.get_db) class Repos < Sequel::Model(:repos) end class Recips < Sequel::Model(:recips) end class RepocRecips < Sequel::Model(:repos_recips) end class Projects < Sequel::Model(:projects) end class ReposProjects < Sequel::Model(:repos_projects) end class ProjectsReposSpec < Sequel::Model(:projects_repos_spec) end class ProjectsProjects < Sequel::Model(:projects_projects) end class BuildTask < Sequel::Model(:buildtask) end class Rpms < Sequel::Model(:rpms) end class BuildRpms < Sequel::Model(:build_rpm) end class DBase attr :error, :last_id, :cfg def initialize(cfg) @cfg = cfg end def creategit(project_name, description) @error = nil data = Repos.where(reponame: project_name).first if data.nil? id = Repos.insert(reponame: project_name, descr: description, public: 1) @last_id = id else @error = "Данный репозиторий уже существует" end @error end def get_repo_info_by_name(repo_name) Repos.where(reponame: repo_name).first end def get_repo_info_by_id(id) Repos[id] end def get_recips() Recips.order(:id).map do |item| { :fname => item[:filepath], :descr => item[:descr], :id => item[:id] } end end def delete_repo_by_name(repo_name) rep_id = Repos.where(reponame: repo_name).first unless rep_id[:id].nil? id = rep_id[:id] RepocRecips.where(repo_id: id).delete ReposProjects.where(repo_id: id).delete Repos.where(reponame: repo_name).delete end end def createrecip(filepath, description, codedata, gitlist) error_data = nil filepath_san = sanitize_rcptname(filepath) is_data = Recips.where(filepath: filepath_san).first if codedata.nil? || codedata.strip == "" error_data else if is_data.nil? id = Recips.insert(filepath: filepath_san, descr: description, content: codedata) @last_id = id if !gitlist.nil? && gitlist.length > 0 gitlist.each do |item| data = Repos.where(id: item.to_i).first unless data.nil? RepocRecips.insert(repo_id: data[:id], recip_id: id) end end end error_data else "Рецепт с таким именем #{filepath_san} уже существует" end end end def updaterecip(id, filepath, description, codedata, gitlist) error_data = nil filepath_san = sanitize_rcptname(filepath) is_data = Recips.where(filepath: filepath_san).first if codedata.nil? || codedata.strip == "" error_data else unless is_data.nil? Recips.where(id: id.to_i).update(filepath: filepath_san, descr: description, content: codedata) RepocRecips.where(recip_id: id.to_i).delete if !gitlist.nil? && gitlist.length > 0 gitlist.each do |item| data = Repos.where(id: item.to_i).first unless data.nil? RepocRecips.insert(repo_id: data[:id], recip_id: id) end end end error_data else "Рецепт с таким именем #{filepath_san} не существует" end end end def get_rcp_info_by_id(rcpi_id) info = Recips[rcpi_id.to_i] gits = RepocRecips.where(recip_id: info[:id]) info[:repos_list] = gits.map { |item| item[:repo_id].to_s } info end def delete_rcp(id) RepocRecips.where(recip_id: id.to_i).delete Recips.where(id: id.to_i).delete end def proj_list Projects.order(:id).all end def proj(id) Projects[id] end def proj_create(proj_name, proj_descr, nopublic) @error = nil data = Projects.where(projname: proj_name).first if data.nil? public_proj = 1 unless nopublic.nil? public_proj = 0 end id = Projects.insert(projname: proj_name, descr: proj_descr, public: public_proj) @last_id = id else @error = "Данный проект уже существует" end @error end def get_gits_for_projects(id) result = [] git_list = ReposProjects.where(proj_id: id.to_i).all unless git_list.nil? result = git_list.map do |item| Repos[item[:repo_id]] end.reject do |item| item.nil? end end result end def save_git_project(prj_id, git_id) result = ReposProjects.where(proj_id: prj_id, repo_id: git_id).first if result.nil? id = ReposProjects.insert(proj_id: prj_id, repo_id: git_id) @last_id = id end end def get_project_repo_spec(prj_id, git_id) ProjectsReposSpec.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).first end def save_project_repo_spec(prj_id, git_id, spec) rep = ProjectsReposSpec.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).first if rep.nil? id = ProjectsReposSpec.insert(proj_id: prj_id.to_i, repo_id: git_id.to_i, spec_name: spec) @last_id = id else ProjectsReposSpec.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).update(spec_name: spec) @last_id = nil end end def delete_project_repo_spec(prj_id, git_id) ProjectsReposSpec.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).delete end def get_projects_links(prj_id) ProjectsProjects.where(proj_id: prj_id.to_i).all end def delete_linked_projects(prj_id) ProjectsProjects.where(proj_id: prj_id.to_i).delete end def delete_linked_projects_with_id(prj_id, prj_id_link) ProjectsProjects.where(proj_id: prj_id.to_i, proj_id_repository: prj_id_link.to_i).delete end def save_linked_projects(prj_id, prj_id_link) item = ProjectsProjects.where(proj_id: prj_id.to_i, proj_id_repository: prj_id_link.to_i).first if item.nil? id = ProjectsProjects.insert(proj_id: prj_id.to_i, proj_id_repository: prj_id_link.to_i) @last_id = id end end def get_git_recips(git_id) res = [] recip = RepocRecips.where(repo_id: git_id.to_i).all unless recip.nil? res = recip.map do |item| rcp_info = Recips[item[:recip_id]] rcp_info end end res end #result = 0 (in progress), 1 (stopped - error), 2 (stopped - success) def create_build_task(prj_id, git_id, proj_path) id = BuildTask.insert(repo_id: git_id.to_i, proj_id: prj_id.to_i, logpath: "", errlogpath: "", result: 0) @last_id = id BuildTask.where(id: id).update(logpath: File.join(proj_path, "#{id}"), errlogpath: File.join(proj_path, "#{id}", "process.log")) end def update_build_task_status(build_id, status) BuildTask.where(id: build_id.to_i).update(result: status.to_i) end def update_build_task_error_log(build_id, path) BuildTask.where(id: build_id.to_i).update(errlogpath: path) end def get_build_task_process_log(build_id) BuildTask.where(id: build_id.to_i).first end def before_fork() Sequel::DATABASES.each(&:disconnect) end def after_fork() $DDB = Sequel.connect(@cfg.get_db) end def save_rpm(build_id, path_to_rpm, rpm_name, git_id, sha256) id = Rpms.insert(savepath: path_to_rpm, rpmname: rpm_name, sign: 0, signpath: "", repo_id: git_id.to_i, filehash: sha256) @last_id = id BuildRpms.insert(build_id: build_id.to_i, rpm_id: id) end def get_gits_rpms() $DDB["select t1.id, t1.reponame, count(*) as packages from repos as t1 join rpms as t2 on t2.repo_id = t1.id group by t1.id, t1.reponame order by t1.id desc"].all end def get_rpms_for_git(git_id) $DDB["select t2.id as rpmid, t2.rpmname, t1.reponame as repoid, t4.id as builid, t4.proj_id as prjid, t4.create_at from repos as t1 join rpms as t2 on t2.repo_id = t1.id join build_rpm as t3 on t3.rpm_id = t2.id join buildtask as t4 on t4.id = t3.build_id where t1.id = ? and t2.savepath not like '%.src.rpm' order by t4.id desc, t2.rpmname", git_id.to_i].all end def get_rpm_info(rpm_id) Rpms[rpm_id.to_i] end def get_rpm_build(rpm_id) bld_info = BuildRpms.where(rpm_id: rpm_id.to_i).first if bld_info.nil? nil else bld_info[:build_id] end end def get_rpm_srpms(rpm_id) bld_info = BuildRpms.where(rpm_id: rpm_id.to_i).first if bld_info.nil? nil else bld_info[:build_id] result = BuildRpms.where(build_id: bld_info[:build_id].to_i) if result.nil? nil else result.each do |item| rpm_p = Rpms[item[:rpm_id].to_i] unless rpm_p.nil? if rpm_p[:savepath] =~ /\.src\.rpm$/ return rpm_p end end end end nil end end def get_builds() $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id left join build_rpm as t4 on t4.build_id = t1.id group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id desc"].all end def get_build_info(build_id) BuildTask[build_id.to_i] end def get_rpms_for_build(build_id) bld_info = BuildRpms.where(build_id: build_id.to_i) bld_info.map do |item| result = Rpms[item[:rpm_id]] result[:fname] = File.basename(result[:savepath]) result end end def get_rpms() Rpms.order(:id).all end def get_builds_for_project(prj_id) $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id left join build_rpm as t4 on t4.build_id = t1.id where t1.proj_id = ? group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id desc", prj_id.to_i].all end def get_builds_for_project_git(prj_id, git_id) $DDB["select t1.id as buildid, t1.create_at as createat, t1.result as state, t2.reponame as reponame, t2.id as gitid, t3.id as projid, t3.projname as prjname, count(*) as pkgcnt from buildtask as t1 join repos as t2 on t1.repo_id = t2.id join projects as t3 on t1.proj_id = t3.id left join build_rpm as t4 on t4.build_id = t1.id where t1.proj_id = ? and t1.repo_id = ? group by buildid, createat, state, reponame, projid, prjname, gitid order by t1.id desc", prj_id.to_i, git_id.to_i].all end def delete_git_from_project(prj_id, git_id) ReposProjects.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).delete ProjectsReposSpec.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).delete end def delete_project(prj_id) ReposProjects.where(proj_id: prj_id.to_i).delete ProjectsReposSpec.where(proj_id: prj_id.to_i).delete builds = BuildTask.where(proj_id: prj_id.to_i) builds.each do |item| rpms = BuildRpms.where(build_id: item[:id]) Rpms.where(id: rpms[:rpm_id]).delete end BuildTask.where(proj_id: prj_id.to_i).delete Projects.where(id: prj_id.to_i).delete end def projects_with_current_as_link(prj_id) ProjectsProjects.where(proj_id_repository: prj_id.to_i).all end def get_rpm_info_by_hash(hash) Rpms.where(filehash: hash).first end def update_rpm_sign(rpm_id, sign_path) Rpms.where(id: rpm_id.to_i).update(sign: 1, signpath: sign_path) end def set_project_address(prj_id, address) Projects.where(id: prj_id.to_i).update(remote_address: address) end def get_gits() Repos.all end def delete_git_by_id(id) Repos.where(id: id.to_i).delete end end