@remote_server=server
end
+
+ def get_remote_server()
+ return @remote_server
+ end
+
+
def set_no_reverse()
@no_reverse = true
end
def get_remote_servers()
- result = []
- rows = nil
get_db_connection() do |db|
- rows = db.select_all("SELECT * FROM remote_build_servers")
- end
-
- if not rows.nil? then
- rows.each do |row|
- svr_ip,svr_port=row['svr_addr'].strip.split(":")
- result.push RemoteBuildServer.new( svr_ip, svr_port, self )
- end
+ return RemoteBuildServer.load_all(db)
end
-
- return result
end
# add new remote friend server
def add_remote_server( ip, port )
- saddr="#{ip}:#{port}"
get_db_connection() do |db|
- row = db.select_one("SELECT * FROM remote_build_servers WHERE svr_addr='#{saddr}'")
- if not row.nil? then return false end
- db.do "INSERT INTO remote_build_servers (svr_addr) VALUES ('#{saddr}')"
+ rs = RemoteBuildServer.load(ip, port, db)
+ if not rs.nil? then return false end
+ RemoteBuildServer.new(ip, port, "").save(db)
end
return true
# remove remote friend server
def remove_remote_server( ip, port )
- saddr="#{ip}:#{port}"
get_db_connection() do |db|
- row = db.select_one("SELECT * FROM remote_build_servers WHERE svr_addr='#{svr_addr}'")
- if row.nil? then return false end
- db.do("DELETE FROM remote_build_servers WHERE svr_addr='#{svr_addr}'")
+ rs = RemoteBuildServer.load(ip, port, db)
+ if rs.nil? then return false end
+ rs.unload(db)
end
return true
end
+ def self.get_supported_os_id(db, os_name)
+ row = db.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'")
+ if not row.nil? then
+ return row['id']
+ else
+ return "NULL"
+ end
+ end
+
+
# get remote server
def get_available_server ( job )
candidates = []
description VARCHAR(255),
CONSTRAINT fk_sync_pkg_servers_distributions1 FOREIGN KEY ( distribution_id ) REFERENCES distributions ( id ) ) #{post_fix}"
- db.do "CREATE TABLE remote_build_servers ( id INTEGER PRIMARY KEY #{inc}, svr_addr VARCHAR(64) NOT NULL UNIQUE, description VARCHAR(256) )#{post_fix}"
- db.do "CREATE TABLE supported_os ( id INTEGER PRIMARY KEY #{inc}, os_category_id INTEGER NOT NULL, name VARCHAR(32) NOT NULL UNIQUE,
- CONSTRAINT fk_supported_os_os_category1 FOREIGN KEY ( os_category_id ) REFERENCES os_category ( id ) ) #{post_fix}"
+ RemoteBuildServer.create_table(db, inc, post_fix)
+
+ db.do "CREATE TABLE supported_os (
+ id INTEGER PRIMARY KEY #{inc},
+ os_category_id INTEGER NOT NULL,
+ name VARCHAR(32) NOT NULL UNIQUE,
+ CONSTRAINT fk_supported_os_os_category1 FOREIGN KEY ( os_category_id ) REFERENCES os_category ( id ) ) #{post_fix}"
# USERS/GROUPS
# users
CONSTRAINT fk_groups_has_projects_projects1 FOREIGN KEY ( project_id ) REFERENCES projects ( id ) )#{post_fix}"
# JOBS
- db.do "CREATE TABLE jobs(id INTEGER PRIMARY KEY, jtype VARCHAR(32), os_name VARCHAR(32), user_id INTEGER, parent_job_id INTEGER, status VARCHAR(32), prj_id INTEGER, dist_name VARCHAR(32), start_time VARCHAR(32), end_time VARCHAR(32) )"
+ CommonJob.create_table(db, post_fix)
end
return result
@type = "Unknown"
@pre_jobs = [] #pre-requisite jobs
@project = nil
- @user_id = 0
+ @user_id = 1
@status = "JUST_CREATED"
@log = nil
end
+ public
+ def self.create_table(db, post_fix)
+ db.do "CREATE TABLE jobs (
+ id INTEGER PRIMARY KEY,
+ project_id INTEGER,
+ user_id INTEGER NOT NULL,
+ supported_os_id INTEGER,
+ distribution_id INTEGER,
+ parent_job_id INTEGER,
+ remote_build_server_id INTEGER,
+ source_id INTEGER,
+ jtype VARCHAR(32) NOT NULL,
+ status VARCHAR(32) NOT NULL DEFAULT 'JUST_CREATED',
+ start_time DATETIME,
+ end_time DATETIME,
+ CONSTRAINT fk_jobs_projects1 FOREIGN KEY ( project_id ) REFERENCES projects ( id ),
+ CONSTRAINT fk_jobs_users1 FOREIGN KEY ( user_id ) REFERENCES users ( id ),
+ CONSTRAINT fk_jobs_supported_os1 FOREIGN KEY ( supported_os_id ) REFERENCES supported_os ( id ),
+ CONSTRAINT fk_jobs_distributions1 FOREIGN KEY ( distribution_id ) REFERENCES distributions ( id ),
+ CONSTRAINT fk_jobs_jobs1 FOREIGN KEY ( parent_job_id ) REFERENCES jobs ( id ),
+ CONSTRAINT fk_jobs_sources1 FOREIGN KEY ( source_id ) REFERENCES sources ( id ),
+ CONSTRAINT fk_jobs_remote_build_servers1 FOREIGN KEY ( remote_build_server_id ) REFERENCES remote_build_servers ( id ) )#{post_fix}"
+ end
+
+
# save to db
+ public
def save(db)
- if @project.nil? then
- prj_id = -1
- else
- prj_id = @project.get_project_id()
- end
- dist_name = get_distribution_name()
- parent_id = @parent.nil? ? -1 : @parent.id
+ prj_id = @project.nil? ? "NULL" : @project.get_project_id()
row=db.select_one("SELECT * FROM jobs WHERE id=#{@id}")
if row.nil? then
start_time = @start_time.strftime("%F %T")
- db.do "INSERT INTO jobs VALUES (#{@id},'#{@type}','#{@os}', #{@user_id}, #{parent_id}, '#{@status}', #{prj_id}, '#{dist_name}', '#{start_time}', '')"
+ os_id = BuildServer.get_supported_os_id(db, @os)
+ dist_id = PackageDistribution.get_distribution_id(db, get_distribution_name())
+ parent_id = @parent.nil? ? "NULL" : @parent.id
+ db.do "INSERT INTO jobs(id,project_id,user_id,supported_os_id, distribution_id, parent_job_id,jtype,status,start_time)
+ VALUES (#{@id},#{prj_id},#{@user_id},#{os_id},#{dist_id},#{parent_id},'#{@type}','#{@status}', NOW())"
else
- db.do "UPDATE jobs SET status='#{@status}' WHERE id=#{@id}"
+ remote_bs_id = (@type == "BUILD" and not get_remote_server().nil?) ?
+ get_remote_server().id : "NULL"
+ if @status == "FINISHED" and not @project.nil? and
+ (@type == "BUILD" or @type == "REGISTER") then
+ source_id = @project.get_source_id_from_ver(pkginfo.get_version(),db)
+ db.do "UPDATE jobs SET source_id=#{source_id} WHERE id=#{@id}"
+ end
+ db.do "UPDATE jobs SET status='#{@status}',remote_build_server_id=#{remote_bs_id}
+ WHERE id=#{@id}"
if @status == "FINISHED" or @status == "ERROR" or @status == "CANCELED" then
@end_time = Time.now.strftime("%F %T")
- db.do "UPDATE jobs SET end_time='#{@end_time}' WHERE id=#{@id}"
+ db.do "UPDATE jobs SET end_time=NOW() WHERE id=#{@id}"
end
end
end
end
+ public
+ def get_source_id_from_ver( src_ver, db )
+ row=db.select_one("SELECT * FROM sources WHERE project_id=#{@prj_id} and pkg_ver='#{src_ver}'")
+ if row.nil? then
+ return "NULL"
+ else
+ return row['id']
+ end
+ end
+
+
protected
def save_source_info_internal(src_ver, info, db)
row1=db.select_one("SELECT * FROM sources WHERE project_id=#{@prj_id} and pkg_ver='#{src_ver}'")
db.do "UPDATE distributions SET pkgsvr_url='#{@pkgsvr_url}', pkgsvr_addr='#{dist_addr}', status='#{@status}', description='#{@description}' WHERE name='#{@name}'"
end
end
+
+
+ def self.get_distribution_id(db, dist_name)
+ row = db.select_one("SELECT * FROM distributions WHERE name='#{dist_name}'")
+ if row.nil? then
+ return "NULL"
+ else
+ return row['id']
+ end
+ end
end
require 'thread'
class RemoteBuildServer
- attr_accessor :ip, :port, :status, :host_os
+ attr_accessor :id, :ip, :port, :description, :status, :host_os
attr_accessor :max_working_jobs, :working_jobs, :waiting_jobs
attr_accessor :path
attr_accessor :jobmgr, :distmgr
# initialize
- def initialize(ip, port, parent)
+ def initialize(ip, port, desc)
+ @id = -1
@ip = ip
@port = port
+ @description = desc
@status = "DISCONNECTED"
@host_os = Utils::HOST_OS
@max_working_jobs = 2
def get_file_transfer_cnt()
return @file_transfer_cnt
end
+
+
+ def set_id(id)
+ @id = id
+ end
+
+
+ def self.create_table(db, inc, post_fix)
+ db.do "CREATE TABLE remote_build_servers (
+ id INTEGER PRIMARY KEY #{inc},
+ svr_addr VARCHAR(64) NOT NULL UNIQUE,
+ description VARCHAR(256) )#{post_fix}"
+ end
+
+
+ def self.load(ip, port, db)
+ saddr="#{ip}:#{port}"
+ row = db.select_one("SELECT * FROM remote_build_servers WHERE svr_addr='#{saddr}'")
+ if not row.nil? then
+ return load_row(row)
+ end
+
+ return nil
+ end
+
+
+ def self.load_all(db)
+ result = []
+ rows = db.select_all("SELECT * FROM remote_build_servers")
+ rows.each do |row|
+ result.push load_row(row)
+ end
+
+ return result
+ end
+
+
+ def self.load_row(row)
+ svr_ip,svr_port=row['svr_addr'].strip.split(":")
+ new_obj = new(svr_ip, svr_port, row['description'] )
+ new_obj.set_id( row['id'] )
+ return new_obj
+ end
+
+
+ def unload(db)
+ db.do("DELETE FROM remote_build_servers WHERE id=#{@id}")
+ end
+
+
+ def save(db)
+ saddr="#{@ip}:#{@port}"
+ db.do "INSERT INTO remote_build_servers (svr_addr,description) VALUES ('#{saddr}','#{@description}')"
+ end
end
new_job = rev_prj.create_new_job_from_version( rev_os, rev_ver )
new_job.set_rev_build_check_job( job )
+ # set user id
+ new_job.user_id = job.user_id
+
rev_build_jobs.push new_job
end