[Title] Modified DB schema for "projects" related items
authordonghee yang <donghee.yang@samsung.com>
Fri, 23 Nov 2012 15:31:19 +0000 (00:31 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Fri, 23 Nov 2012 15:31:19 +0000 (00:31 +0900)
src/build_server/BinaryUploadProject.rb
src/build_server/BuildServer.rb
src/build_server/CommonProject.rb
src/build_server/DistributionManager.rb
src/build_server/GitBuildProject.rb
src/build_server/ProjectManager.rb

index c7c89dd5bc5ba88db5f8d1abe181f7893a47c398..ff77533a67415885c6b9f8c784bd2388a3414c40 100644 (file)
@@ -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 )
index b2be846f276cc96b5fd40135afd5979213850392..f9f9360d2e11215c400a1d879e3779408af2635b 100644 (file)
@@ -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) )"
index 4bed058f9fb4fd88e4bad5e60b661cf521f47930..9c9be8359c748de3a11bc58b424c07eab0ff8814 100644 (file)
@@ -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
index d6374d30d1b7d62194d9b19bcfabd464020a523d..d758d8810fb96c9a9835f824db882339fdde24d2 100644 (file)
@@ -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']
        
index 0f69e58963c5f44cdde69b4314f37212127f0eaa..c8f5e90c8ee327b281ff6894a3045b12ef13b0e2 100644 (file)
@@ -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 )
index c216e8a1ed55f79b7f38c84a0cc61bb0de657156..6b13a1b2c7558c5fbbca4c6689f91bb3e9da3164 100644 (file)
@@ -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']