From: donghee yang Date: Fri, 23 Nov 2012 15:31:19 +0000 (+0900) Subject: [Title] Modified DB schema for "projects" related items X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3e0ee788dd3867b2caddc734b15260cf7afbb478;p=sdk%2Ftools%2Fsdk-build.git [Title] Modified DB schema for "projects" related items --- diff --git a/src/build_server/BinaryUploadProject.rb b/src/build_server/BinaryUploadProject.rb index c7c89dd..ff77533 100644 --- a/src/build_server/BinaryUploadProject.rb +++ b/src/build_server/BinaryUploadProject.rb @@ -131,9 +131,8 @@ class BinaryUploadProject < CommonProject prj_id = row['id'] prj_name = row['name'] prj_passwd = row['password'] - prj_dist = row['dist_name'] - new_project = BinaryUploadProject.new(prj_name, server, prj_os_list, prj_dist) + new_project = BinaryUploadProject.new(prj_name, server, prj_os_list, dist_name) if not prj_passwd.empty? then new_project.passwd = prj_passwd end new_project.set_project_id( prj_id ) new_project.set_source_info( source_info ) diff --git a/src/build_server/BuildServer.rb b/src/build_server/BuildServer.rb index b2be846..f9f9360 100644 --- a/src/build_server/BuildServer.rb +++ b/src/build_server/BuildServer.rb @@ -346,7 +346,7 @@ class BuildServer if not row.nil? then return false end row = db.select_one("SELECT id FROM distributions WHERE name='#{dist}'") dist_id = row['id']; - db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,distribution_id) VALUES('#{url}','#{@pkg_sync_period}','#{dist_id}')" + db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,distribution_id) VALUES('#{url}','#{@pkg_sync_period}',#{dist_id})" end return true @@ -359,7 +359,7 @@ class BuildServer row = db.select_one("SELECT distributions.id FROM sync_pkg_servers,distributions WHERE sync_pkg_servers.pkgsvr_url='#{url}' and distributions.name='#{dist}'") if row.nil? then return false end dist_id = row['id']; - db.do("DELETE FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and distribution_id='#{dist_id}'") + db.do("DELETE FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and distribution_id=#{dist_id}") end return true @@ -646,12 +646,9 @@ class BuildServer db.do "INSERT INTO user_groups (users_id, groups_id) SELECT users.id,groups.id FROM users,groups WHERE users.email = 'admin@user' and groups.name = 'admin'" # PROJECTS - db.do "CREATE TABLE projects(id INTEGER PRIMARY KEY #{inc}, name VARCHAR(32), ptype VARCHAR(32), password VARCHAR(32), dist_name VARCHAR(32))" - db.do "CREATE TABLE project_os(prj_id INTEGER, os_name VARCHAR(32))" + CommonProject.create_table(db, inc, post_fix) db.do "CREATE TABLE project_gits(prj_id INTEGER, git_repos VARCHAR(128), git_branch VARCHAR(32))" - db.do "CREATE TABLE project_sources(prj_id INTEGER, pkg_ver VARCHAR(64), location VARCHAR(256))" db.do "CREATE TABLE project_bins(prj_id INTEGER, pkg_name VARCHAR(64))" - db.do "CREATE TABLE project_packages(prj_id INTEGER, pkg_ver VARCHAR(64), pkg_name VARCHAR(64), pkg_os VARCHAR(32))" # 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) )" diff --git a/src/build_server/CommonProject.rb b/src/build_server/CommonProject.rb index 4bed058..9c9be83 100644 --- a/src/build_server/CommonProject.rb +++ b/src/build_server/CommonProject.rb @@ -166,35 +166,72 @@ class CommonProject end + def self.create_table(db, inc, post_fix) + db.do "CREATE TABLE projects ( + id INTEGER PRIMARY KEY #{inc}, + distribution_id INTEGER NOT NULL, + name VARCHAR(32) NOT NULL, + ptype VARCHAR(32) NOT NULL, + password VARCHAR(32), + CONSTRAINT fk_projects_distributions1 FOREIGN KEY ( distribution_id ) REFERENCES distributions ( id ) )#{post_fix}" + + db.do "CREATE TABLE project_os ( + project_id INTEGER NOT NULL, + supported_os_id INTEGER NOT NULL, + PRIMARY KEY ( project_id,supported_os_id ), + CONSTRAINT fk_projects_has_supported_os_projects FOREIGN KEY ( project_id ) REFERENCES projects ( id ), + CONSTRAINT fk_projects_has_supported_os_supported_os1 FOREIGN KEY ( supported_os_id ) REFERENCES supported_os ( id ) )#{post_fix}" + + db.do "CREATE TABLE sources ( + id INTEGER PRIMARY KEY #{inc}, + project_id INTEGER NOT NULL, + pkg_ver VARCHAR(64) NOT NULL, + location VARCHAR(256) NOT NULL, + CONSTRAINT fk_project_sources_projects1 FOREIGN KEY ( project_id ) REFERENCES projects ( id ))#{post_fix}" + + db.do "CREATE TABLE packages ( + id INTEGER PRIMARY KEY #{inc}, + source_id INTEGER NOT NULL, + supported_os_id INTEGER NOT NULL, + pkg_name VARCHAR(64) NOT NULL, + CONSTRAINT fk_project_packages_project_sources1 FOREIGN KEY ( source_id ) REFERENCES sources ( id ), + CONSTRAINT fk_project_packages_supported_os1 FOREIGN KEY ( supported_os_id ) REFERENCES supported_os ( id ) )#{post_fix}" + end + + protected def self.load_row(name, dist_name, db) - row = db.select_one("SELECT * FROM projects WHERE name='#{name}' and dist_name='#{dist_name}'") + row = db.select_one("SELECT * FROM distributions WHERE name='#{dist_name}'") + if row.nil? then return nil end + dist_id = row['id'] + row = db.select_one("SELECT * FROM projects WHERE name='#{name}' and distribution_id=#{dist_id}") if row.nil? then return nil end # get supported_os prj_id = row['id'] os_list = [] - rows = db.select_all("SELECT os_name FROM project_os WHERE prj_id=#{prj_id}") + rows = db.select_all("SELECT supported_os.name FROM project_os,supported_os WHERE project_id=#{prj_id} and supported_os.id = project_os.supported_os_id") rows.each do |r| - os_list.push r['os_name'] + os_list.push r['name'] end - # get source info + # get source info/ package info source_info = {} - rows=db.select_all("SELECT * FROM project_sources WHERE prj_id=#{prj_id}") + package_info = {} + rows=db.select_all("SELECT * FROM sources WHERE project_id=#{prj_id}") rows.each do |r| source_info[r['pkg_ver']] = r['location'] - end - # get package info - package_info = {} - rows=db.select_all("SELECT * FROM project_packages WHERE prj_id=#{prj_id}") - rows.each do |r| - if package_info[r['pkg_ver']].nil? then - package_info[r['pkg_ver']] = [] - end - package_info[r['pkg_ver']].push [r['pkg_name'], r['pkg_os']] - end + source_id = r['id'] + rows2=db.select_all("SELECT packages.pkg_name,supported_os.name as os_name + FROM packages,supported_os WHERE source_id=#{source_id} and packages.supported_os_id=supported_os.id") + rows2.each do |r2| + if package_info[r['pkg_ver']].nil? then + package_info[r['pkg_ver']] = [] + end + package_info[r['pkg_ver']].push [r2['pkg_name'], r2['os_name']] + end + end return row, os_list, source_info, package_info end @@ -203,22 +240,31 @@ class CommonProject protected def save_common(db) if @prj_id == -1 then - db.do "INSERT INTO projects (name,ptype,password,dist_name) VALUES ('#{@name}','#{@type}','#{@passwd}','#{@dist_name}')" + row = db.select_one("SELECT * FROM distributions WHERE name='#{@dist_name}'") + dist_id = row['id'] + db.do "INSERT INTO projects (distribution_id,name,ptype,password) + VALUES (#{dist_id},'#{@name}','#{@type}','#{@passwd}')" case @server.db_dsn when /^SQLite3:/ then @prj_id = db.select_one("select last_insert_rowid()")[0] when /^Mysql:/ then @prj_id = db.func(:insert_id) else @prj_id = db.select_one("select last_insert_rowid()")[0] end @os_list.each do |os| - db.do "INSERT INTO project_os VALUES('#{@prj_id}','#{os}')" + row = db.select_one("SELECT * FROM supported_os WHERE name='#{os}'") + os_id = row['id'] + db.do "INSERT INTO project_os VALUES(#{@prj_id},#{os_id})" end return true else - db.do "UPDATE projects SET ptype='#{@type}',password='#{@passwd}' WHERE name='#{@name}' and dist_name='#{@dist_name}')" - db.do "DELETE FROM project_os WHERE prj_id=#{@prj_id}" + row = db.select_one("SELECT * FROM distributions WHERE name='#{@dist_name}'") + dist_id = row['id'] + db.do "UPDATE projects SET ptype='#{@type}',password='#{@passwd}' WHERE name='#{@name}' and distribution_id=#{dist_id})" + db.do "DELETE FROM project_os WHERE project_id=#{@prj_id}" @os_list.each do |os| - db.do "INSERT INTO project_os VALUES('#{@prj_id}','#{os}')" + row = db.select_one("SELECT * FROM supported_os WHERE name='#{os}'") + os_id = row['id'] + db.do "INSERT INTO project_os VALUES(#{@prj_id},#{os_id})" end @source_info.each do |src_ver,info| @@ -238,18 +284,23 @@ class CommonProject protected def save_source_info_internal(src_ver, info, db) - row1=db.select_one("SELECT * FROM project_sources WHERE prj_id=#{@prj_id} and pkg_ver='#{src_ver}'") + row1=db.select_one("SELECT * FROM sources WHERE project_id=#{@prj_id} and pkg_ver='#{src_ver}'") if row1.nil? then - db.do "INSERT INTO project_sources VALUES(#{@prj_id},'#{src_ver}','#{info}')" + db.do "INSERT INTO sources(project_id, pkg_ver,location) + VALUES(#{@prj_id},'#{src_ver}','#{info}')" end end protected def save_package_info_internal(src_ver, pkg_name, pkg_os, db) - row1=db.select_one("SELECT * FROM project_packages WHERE prj_id=#{@prj_id} and pkg_ver='#{src_ver}' and pkg_name='#{pkg_name}' and pkg_os='#{pkg_os}'") + row=db.select_one("SELECT * FROM sources WHERE project_id=#{@prj_id} and pkg_ver='#{src_ver}'") + source_id = row['id'] + row = db.select_one("SELECT * FROM supported_os WHERE name='#{pkg_os}'") + os_id = row['id'] + row1=db.select_one("SELECT * FROM packages WHERE source_id=#{source_id} and pkg_name='#{pkg_name}' and supported_os_id=#{os_id}") if row1.nil? then - db.do "INSERT INTO project_packages VALUES(#{@prj_id},'#{src_ver}','#{pkg_name}','#{pkg_os}')" + db.do "INSERT INTO packages(source_id,supported_os_id,pkg_name) VALUES(#{source_id},#{os_id},'#{pkg_name}')" end end @@ -259,9 +310,37 @@ class CommonProject def unload_common(db) row = db.select_one("SELECT * FROM projects WHERE id=#{@prj_id}") if row.nil? then return -1 end - db.do("DELETE FROM projects WHERE name='#{@name}' and dist_name='#{@dist_name}'") - db.do "DELETE FROM project_os WHERE prj_id=#{@prj_id}" - db.do "DELETE FROM project_sources WHERE prj_id=#{@prj_id}" - db.do "DELETE FROM project_packages WHERE prj_id=#{@prj_id}" + db.do "DELETE FROM project_os WHERE project_id=#{@prj_id}" + rows=db.select_all("SELECT * FROM sources WHERE project_id=#{@prj_id}") + rows.each do |r| + source_id = r['id'] + db.do "DELETE FROM packages WHERE source_id=#{source_id}" + end + db.do "DELETE FROM sources WHERE project_id=#{@prj_id}" + db.do("DELETE FROM projects WHERE id=#{@prj_id}") + end + + + public + def self.get_project_row(name, dist_name, db) + row = db.select_one("SELECT * FROM distributions WHERE name='#{dist_name}'") + dist_id = row['id'] + row = db.select_one("SELECT * FROM projects WHERE name='#{name}' and distribution_id=#{dist_id}") + return row + end + + + public + def self.get_all_project_rows(db) + result = [] + rows = db.select_all("SELECT projects.name,distributions.name as dist_name,projects.ptype + FROM projects,distributions WHERE projects.distribution_id=distributions.id") + rows.each do |row| + prj_name = row['name'] + prj_dist = row['dist_name'] + prj_type = row['ptype'] + result.push [prj_name, prj_dist, prj_type] + end + return result end end diff --git a/src/build_server/DistributionManager.rb b/src/build_server/DistributionManager.rb index d6374d3..d758d88 100644 --- a/src/build_server/DistributionManager.rb +++ b/src/build_server/DistributionManager.rb @@ -98,7 +98,6 @@ class PackageDistribution def self.load_row(row) pkgsvr_ip = row['pkgsvr_addr'].split(":")[0] pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i - new_obj = new(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port, row['status']) new_obj.description = row['description'] diff --git a/src/build_server/GitBuildProject.rb b/src/build_server/GitBuildProject.rb index 0f69e58..c8f5e90 100644 --- a/src/build_server/GitBuildProject.rb +++ b/src/build_server/GitBuildProject.rb @@ -105,9 +105,8 @@ class GitBuildProject < CommonProject prj_id = row['id'] prj_name = row['name'] prj_passwd = row['password'] - prj_dist = row['dist_name'] - new_project = GitBuildProject.new(prj_name, server, prj_os_list, prj_dist) + new_project = GitBuildProject.new(prj_name, server, prj_os_list, dist_name) if not prj_passwd.empty? then new_project.passwd = prj_passwd end new_project.set_project_id( prj_id ) new_project.set_source_info( source_info ) diff --git a/src/build_server/ProjectManager.rb b/src/build_server/ProjectManager.rb index c216e8a..6b13a1b 100644 --- a/src/build_server/ProjectManager.rb +++ b/src/build_server/ProjectManager.rb @@ -67,11 +67,11 @@ class ProjectManager result = [] @server.get_db_connection() do |db| - rows = db.select_all("SELECT * FROM projects") + rows = CommonProject.get_all_project_rows(db) rows.each do |row| - prj_name = row['name'] - prj_dist = row['dist_name'] - prj_type = row['ptype'] + prj_name = row[0] + prj_dist = row[1] + prj_type = row[2] if prj_type == "GIT" then prj = GitBuildProject.load(prj_name, prj_dist, @server, db) else @@ -321,7 +321,7 @@ class ProjectManager private def get_project_internal(name, dist_name, db) - row = db.select_one("SELECT * FROM projects WHERE name='#{name}' and dist_name='#{dist_name}'") + row = CommonProject.get_project_row(name, dist_name, db) if row.nil? then return nil end prj_type = row['ptype']