[Title] Integrated basic DB
authordonghee yang <donghee.yang@samsung.com>
Thu, 27 Sep 2012 01:27:18 +0000 (10:27 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Thu, 27 Sep 2012 01:27:18 +0000 (10:27 +0900)
build-svr
src/build_server/BinaryUploadProject.rb
src/build_server/BuildServer.rb
src/build_server/BuildServerController.rb
src/build_server/CommonProject.rb
src/build_server/GitBuildProject.rb
src/build_server/ProjectManager.rb
test/buildsvr.init

index 78e48bd8af30a75093dad48d8c5fa1eadf93cbde..02727cec18b6ac9d5eb53a92ba12a530ef289306 100755 (executable)
--- a/build-svr
+++ b/build-svr
@@ -1,4 +1,4 @@
-#!/usr/bin/ruby -d
+#!/usr/bin/ruby
 
 =begin
  
@@ -78,7 +78,7 @@ begin
         ftpsvr_port = ftp_result[1]
         ftpsvr_username = ftp_result[2]
         ftpsvr_passwd = ftp_result[3]
-               BuildServerController.create_server( option[:name], Utils::WORKING_DIR, option[:url], pkgsvr_addr, pkgsvr_port, option[:pid], ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd )
+               BuildServerController.create_server( option[:name], Utils::WORKING_DIR, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd, option[:url], pkgsvr_addr, pkgsvr_port )
        when "remove"
                BuildServerController.remove_server( option[:name] ) 
        when "start"
index 28f81ea4afff756372ae0994733883f759f09fc1..3dc69b35720b1cce7d16dd950689d76a1716c09f 100644 (file)
@@ -27,6 +27,7 @@ Contributors:
 =end
 
 require 'fileutils'
+require 'sqlite3'
 $LOAD_PATH.unshift File.dirname(__FILE__)
 require "CommonProject.rb"
 require "RegisterPackageJob.rb"
@@ -38,7 +39,7 @@ class BinaryUploadProject < CommonProject
        attr_accessor :pkg_name
 
        # initialize
-       def initialize( name, pkg_name, server, os_list )
+       def initialize( name, server, os_list, pkg_name = nil )
                super(name, "BINARY", server, os_list)
                @pkg_name = pkg_name
        end
@@ -88,4 +89,34 @@ class BinaryUploadProject < CommonProject
                        return false
                end
        end
+
+
+       def save_db()
+               config_file = "#{@server.path}/projects/#{@name}/build"
+               File.open( config_file, "w" ) do |f|
+                       f.puts "TYPE=BINARY"
+                       f.puts "PACKAGE_NAME=#{@pkg_name}"
+               end
+       end
+
+
+       def load_db()
+               # git
+               config_file = "#{@server.path}/projects/#{@name}/build"
+               pkg_name=nil
+               File.open( config_file, "r" ) do |f|
+                       f.each_line do |l| 
+                               idx = l.index("=") + 1
+                               length = l.length - idx 
+
+                               if l.start_with?("PACKAGE_NAME=")
+                                       pkg_name = l[idx,length].strip
+                               else
+                                       next    
+                               end 
+                       end
+               end
+
+               @pkg_name = pkg_name
+       end
 end
index 0c7e3c61dfc6264e1406080e40a776a41c9d064b..d92d637eb6730ed44a429ce0b2f1fed34d12cf8e 100644 (file)
@@ -27,6 +27,7 @@ Contributors:
 =end
 
 require 'fileutils'
+require 'sqlite3'
 $LOAD_PATH.unshift File.dirname(__FILE__)
 require "SocketJobRequestListener.rb"
 require "RemoteBuildJob.rb"
@@ -37,7 +38,7 @@ require "PackageSync.rb"
 require "ProjectManager.rb"
 
 class BuildServer
-       attr_accessor :id, :path, :pkgserver_url, :pkgserver_addr, :pkgserver_port, :pkgserver_id, :port, :status, :friend_servers, :host_os, :log
+       attr_accessor :id, :path, :pkgserver_url, :pkgserver_addr, :pkgserver_port, :port, :status, :friend_servers, :host_os, :log
        attr_accessor :git_server_url, :git_bin_path
        attr_accessor :job_log_url
        attr_accessor :allowed_git_branch
@@ -65,13 +66,12 @@ class BuildServer
        HOST_OS = Utils::HOST_OS
 
        # initialize
-       def initialize (id, path, pkgsvr_url, pkgsvr_addr, pkgsvr_port, pkgsvr_id, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd)
+       def initialize (id, path, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd)
                @id = id
                @path = path
-               @pkgserver_url = pkgsvr_url
-               @pkgserver_addr = pkgsvr_addr
-        @pkgserver_port = pkgsvr_port
-               @pkgserver_id = pkgsvr_id
+               @pkgserver_url = nil
+               @pkgserver_addr = nil
+        @pkgserver_port = nil
                @friend_servers = []
                @remote_pkg_servers = []
                @req_listener = []
@@ -114,9 +114,6 @@ class BuildServer
 
        # start server daemon
        def start
-               # start
-               @log = Log.new( "#{BuildServer::CONFIG_ROOT}/#{@id}/log" )
-
                # set build cache dir
                @build_cache_dir="#{BuildServer::CONFIG_ROOT}/#{@id}/build_cache"
                if not File.exist? @build_cache_dir then
@@ -351,5 +348,136 @@ class BuildServer
                return @jobmgr.has_waiting_jobs
        end
 
+
+       def db_exist?
+               if File.exist? "#{BuildServer::CONFIG_ROOT}/#{@id}/server.db" then
+                       return true
+               else
+                       return false
+               end
+       end
+
+
+       def create_db()
+               # create DB
+               db_file = "#{BuildServer::CONFIG_ROOT}/#{@id}/server.db" 
+               begin
+                       db = SQLite3::Database.new db_file
+
+                       # create table
+                       db.execute "CREATE TABLE IF NOT EXISTS distributions(name VARCHAR(32) PRIMARY KEY, pkgsvr_url VARCHAR(256), pkgsvr_addr VARCHAR(64))"
+                       db.execute "CREATE TABLE IF NOT EXISTS remote_build_servers(id INTEGER PRIMARY KEY, svr_addr VARCHAR(64))"
+                       db.execute "CREATE TABLE IF NOT EXISTS sync_pkg_servers(id INTEGER PRIMARY KEY, pkgsvr_url VARCHAR(256), period INTEGER)"
+                       db.execute "CREATE TABLE IF NOT EXISTS supported_os(name VARCHAR(32) PRIMARY KEY)"
+                       db.execute "CREATE TABLE IF NOT EXISTS projects(id INTEGER PRIMARY KEY, name VARCHAR(32), type VARCHAR(32), password VARCHAR(32), dist_name VARCHAR(32))"
+                       db.execute "CREATE TABLE IF NOT EXISTS project_os(prj_id INTEGER, os_name VARCHAR(32))"
+               rescue SQLite3::Exception => e
+                       puts "DB Creation failed!"
+                       puts e
+               ensure
+                       db.close if db
+               end
+       end
+
+
+       # save
+       def save_db()
+               db_file = "#{BuildServer::CONFIG_ROOT}/#{@id}/server.db" 
+               begin
+                       # open DB
+                       db = SQLite3::Database.open db_file
+
+                       # distributions
+                       url = @pkgserver_url
+                       addr = @pkgserver_addr + ":" + @pkgserver_port.to_s
+                       db.execute "DELETE FROM distributions"
+                       db.execute "INSERT INTO distributions VALUES('BASE','#{url}','#{addr}')"
+
+                       # remote_build_servers
+                       db.execute "DELETE FROM remote_build_servers"
+                       idx = 0
+                       @friend_servers.each { |svr|
+                               db.execute "INSERT INTO remote_build_servers VALUES('#{idx}','#{svr.ip}:#{svr.port}')"
+                               idx += 1
+                       }
+               
+                       # sync_pkg_servers
+                       db.execute "DELETE FROM sync_pkg_servers"
+                       idx = 0
+                       @remote_pkg_servers.each { |svr|
+                               db.execute "INSERT INTO sync_pkg_servers VALUES('#{idx}','#{svr[0]}','#{@pkg_sync_period}')"
+                               idx += 1
+                       }
+
+                       # supported_os
+                       db.execute "DELETE FROM supported_os"
+                       @supported_os_list.each { |os|
+                               db.execute "INSERT INTO supported_os VALUES('#{os}')"
+                       }
+       
+               rescue SQLite3::Exception => e
+                       puts "DB update failed!"
+                       puts e
+               ensure
+                       db.close if db
+               end
+       end
+
+
+       # load
+       def load_db()
+               db_file = "#{BuildServer::CONFIG_ROOT}/#{@id}/server.db" 
+               begin
+                       # open DB
+                       db = SQLite3::Database.open db_file
+                       db.results_as_hash = true
+
+                       # distributions
+                       stm = db.prepare "SELECT * FROM distributions"
+                       rs = stm.execute
+                       rs.each { |row|
+                               @pkgserver_url = row['pkgsvr_url']
+                               @pkgserver_addr = row['pkgsvr_addr'].split(":")[0]
+                               @pkgserver_port = row['pkgsvr_addr'].split(":")[1].to_i
+                       }
+                       stm.close if stm
+
+                       # remote_build_servers
+                       @friend_servers = []
+                       stm = db.prepare "SELECT * FROM remote_build_servers"
+                       rs = stm.execute
+                       rs.each { |row|
+                               add_remote_server(
+                                       row['svr_addr'].split(":")[0], 
+                                       row['svr_addr'].split(":")[1].to_i)
+                       }
+                       stm.close if stm
+
+                       # sync_package_servers
+                       @remote_pkg_servers = []
+                       stm = db.prepare "SELECT * FROM sync_pkg_servers"
+                       rs = stm.execute
+                       rs.each { |row|
+                               add_remote_package_server( row['pkgsvr_url'], nil )
+                               @pkg_sync_period = row['period'].to_i
+                       }
+                       stm.close if stm
+
+                       # supported_os
+                       @supported_os_list = []
+                       stm = db.prepare "SELECT * FROM supported_os"
+                       rs = stm.execute
+                       rs.each { |row|
+                               add_target_os( row['name'] )
+                       }
+               rescue SQLite3::Exception => e
+                       puts "DB loading failed!"
+                       puts e
+               ensure
+                       stm.close if stm
+                       db.close if db
+               end
+       end
+
 end
 
index 4be6726521b7de1b1a2236447b58ae15dbd508de..bc6c87a112aa43386aacfa394c65ef2a8251585f 100644 (file)
@@ -34,7 +34,7 @@ class BuildServerController
        @@instance_map = {}
 
        # create
-       def self.create_server (id, path, pkgsvr_url, pkgsvr_addr, pkgsvr_port, pkgsvr_id, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd)
+       def self.create_server (id, path, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd, pkgsvr_url=nil, pkgsvr_addr=nil, pkgsvr_port=3333 )
 
                # check server config root
                check_build_server_root
@@ -45,21 +45,21 @@ class BuildServerController
                end
 
                # create new instance and return it
-               @@instance_map[id] = BuildServer.new( id, path, pkgsvr_url, pkgsvr_addr, pkgsvr_port, pkgsvr_id, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd)
+               @@instance_map[id] = BuildServer.new( id, path, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd)
                
                # set default
-               @@instance_map[id].git_server_url="gerrithost:"
                if Utils.is_windows_like_os(Utils::HOST_OS) then
                        @@instance_map[id].git_bin_path="/c/Program\\ Files/Git/bin/git.exe"
                else
                        @@instance_map[id].git_bin_path="/usr/bin/git"
                end
-               @@instance_map[id].allowed_git_branch=nil
                @@instance_map[id].jobmgr.max_working_jobs= 2
                @@instance_map[id].job_log_url=""
                @@instance_map[id].send_mail="NO"
+               @@instance_map[id].pkgserver_url=pkgsvr_url
+               @@instance_map[id].pkgserver_addr=pkgsvr_addr
+               @@instance_map[id].pkgserver_port=pkgsvr_port
        
-
                # write config
                write_server_config( @@instance_map[id] )
 
@@ -100,6 +100,9 @@ class BuildServerController
                # get server config and return its object
                @@instance_map[id] = read_server_config(id)
 
+               # set logger first
+               @@instance_map[id].log = Log.new( "#{BuildServer::CONFIG_ROOT}/#{id}/log" )
+
                return @@instance_map[id]
        end
 
@@ -252,13 +255,7 @@ class BuildServerController
                
                # add
                if server.add_remote_server( ip, port ) then
-
-                       # write config  
-                       server_dir = "#{BuildServer::CONFIG_ROOT}/#{server.id}"
-                       f = File.open( "#{server_dir}/friends", "a" )
-                       f.puts "#{ip},#{port}"
-                       f.close 
-                       
+                       server.save_db()
                        puts "Friend server is added successfully!"
                        
                        return true
@@ -275,23 +272,11 @@ class BuildServerController
                
                # add
                if server.add_remote_package_server( url, proxy ) then
-
-                       # write config  
-                       server_dir = "#{BuildServer::CONFIG_ROOT}/#{server.id}"
-                       f = File.open( "#{server_dir}/remote_pkg_servers", "a" )
-                       if not proxy.nil? then
-                               f.puts "#{url}|#{proxy}"
-                       else
-                               f.puts "#{url}|"
-                       end
-                       f.close 
-                       
+                       server.save_db()
                        puts "Remote package server is added!"
-                       
                        return true
                else
                        puts "The server already exists in list!"
-
                        return false
                end
        end
@@ -310,15 +295,8 @@ class BuildServerController
                
                # add
                if server.add_target_os( os_name ) then
-
-                       # write config  
-                       server_dir = "#{BuildServer::CONFIG_ROOT}/#{server.id}"
-                       f = File.open( "#{server_dir}/supported_os_list", "a" )
-                       f.puts "#{os_name}"
-                       f.close 
-                       
+                       server.save_db()
                        puts "Target OS is added successfully!"
-                       
                        return true
                else
                        puts "Target OS already exists in list!"
@@ -501,13 +479,7 @@ class BuildServerController
                File.open( "#{server_dir}/server.cfg", "w" ) do |f|
                        f.puts "ID=#{server.id}"
                        f.puts "PATH=#{server.path}"
-                       f.puts "PSERVER_URL=#{server.pkgserver_url}"
-                       f.puts "PSERVER_ADDR=#{server.pkgserver_addr}"
-            f.puts "PSERVER_PORT=#{server.pkgserver_port}"
-                       f.puts "PSERVER_ID=#{server.pkgserver_id}"
-                       f.puts "GIT_SERVER_URL=#{server.git_server_url}"
                        f.puts "GIT_BIN_PATH=#{server.git_bin_path}"
-                       f.puts "ALLOWED_GIT_BRANCH=#{server.allowed_git_branch}"
                        f.puts "MAX_WORKING_JOBS=#{server.jobmgr.max_working_jobs}"
                        f.puts "JOB_LOG_URL=#{server.job_log_url}"
                        f.puts "SEND_MAIL=#{server.send_mail}"
@@ -518,21 +490,20 @@ class BuildServerController
             f.puts "FTP_PORT=#{server.ftp_port}"            
                        f.puts "FTP_USERNAME=#{server.ftp_username}"
                        f.puts "FTP_PASSWD=#{server.ftp_passwd}"
-                       f.puts "PKG_SYNC_PERIOD=#{server.pkg_sync_period}"
                end
+
+               # save to server.db
+               if not server.db_exist? then
+                       server.create_db()
+               end
+               server.save_db()
        end
 
 
        # read server configuration
        def self.read_server_config( id )
                path=""
-               pkgsvr_url=""
-               pkgsvr_addr=""
-        pkgsvr_port="3333"
-               pkgsvr_id=""
-               git_server_url="gerrithost:"
                git_bin_path="/usr/bin/git"
-               allowed_git_branch=""
                max_working_jobs= 2
                job_log_url=""
                send_mail="NO"
@@ -543,7 +514,6 @@ class BuildServerController
                ftp_port="21"
                ftp_username=""
                ftp_passwd=""
-               pkg_sync_period=600             
 
                # read configuration
                server_dir = "#{BuildServer::CONFIG_ROOT}/#{id}"
@@ -554,20 +524,8 @@ class BuildServerController
 
                                if l.start_with?("PATH=")
                                        path = l[idx,length].strip
-                               elsif l.start_with?("PSERVER_URL=")
-                                       pkgsvr_url = l[idx,length].strip
-                               elsif l.start_with?("PSERVER_ADDR=")
-                                       pkgsvr_addr = l[idx,length].strip
-                               elsif l.start_with?("PSERVER_PORT=")
-                                       pkgsvr_port = l[idx,length].strip
-                               elsif l.start_with?("PSERVER_ID=")
-                                       pkgsvr_id = l[idx,length].strip
-                               elsif l.start_with?("GIT_SERVER_URL=")
-                                       git_server_url = l[idx,length].strip
                                elsif l.start_with?("GIT_BIN_PATH=")
                                        git_bin_path = l[idx,length].strip
-                               elsif l.start_with?("ALLOWED_GIT_BRANCH=")
-                                       allowed_git_branch = l[idx,length].strip
                                elsif l.start_with?("MAX_WORKING_JOBS=")
                                        max_working_jobs = l[idx,length].strip.to_i
                                elsif l.start_with?("JOB_LOG_URL=")
@@ -588,8 +546,6 @@ class BuildServerController
                                        ftp_username = l[idx,length].strip
                                elsif l.start_with?("FTP_PASSWD=")
                                        ftp_passwd = l[idx,length].strip
-                               elsif l.start_with?("PKG_SYNC_PERIOD=")
-                                       pkg_sync_period = l[idx,length].strip.to_i
                                else
                                        next    
                                end 
@@ -597,7 +553,7 @@ class BuildServerController
                end
 
                # create server object
-               obj = BuildServer.new( id, path, pkgsvr_url, pkgsvr_addr, pkgsvr_port, pkgsvr_id, ftp_addr, ftp_port, ftp_username, ftp_passwd )
+               obj = BuildServer.new( id, path, ftp_addr, ftp_port, ftp_username, ftp_passwd )
 
                # check running port
                if File.exist? "#{server_dir}/run" then
@@ -607,43 +563,6 @@ class BuildServerController
                        f.close
                end
 
-               # check friend server
-               if File.exist? "#{server_dir}/friends" then
-                       File.open( "#{server_dir}/friends", "r" ) do |f|
-                               f.each_line do |l|
-                                       if l.split(",").count < 2 then next end
-                                       ip = l.split(",")[0].strip
-                                       port = l.split(",")[1].strip
-                                       obj.add_remote_server( ip, port.to_i )
-                               end
-                       end
-               end             
-
-               # check remote package server
-               if File.exist? "#{server_dir}/remote_pkg_servers" then
-                       File.open( "#{server_dir}/remote_pkg_servers", "r" ) do |f|
-                               f.each_line do |l|
-                                       if l.split("|").count < 2 then next end
-                                       url = l.split("|")[0].strip
-                                       proxy = l.split("|")[1].strip
-                                       obj.add_remote_package_server( url, proxy )
-                               end
-                       end
-               end
-               
-               # check supported os
-               if File.exist? "#{server_dir}/supported_os_list" then
-                       File.open( "#{server_dir}/supported_os_list", "r" ) do |f|
-                               f.each_line do |l|
-                                       os_name = l.strip
-                                       obj.add_target_os( os_name )
-                               end
-                       end
-               end     
-       
-               # set git server url
-               obj.git_server_url = git_server_url
-
                # set git binary path
                obj.git_bin_path = git_bin_path
        
@@ -656,9 +575,6 @@ class BuildServerController
                # set send mail
                obj.send_mail = send_mail
 
-               # set allowed git branch name
-               obj.allowed_git_branch = allowed_git_branch
-
                # set test time 
                obj.test_time = test_time
 
@@ -674,8 +590,8 @@ class BuildServerController
                obj.ftp_username = ftp_username
                obj.ftp_passwd = ftp_passwd
 
-               # pkg synchronization
-               obj.pkg_sync_period = pkg_sync_period
+               # load from DB
+               obj.load_db()
 
                # save config
                write_server_config( obj )
index 10caaafb0e50b2610abd3b495da3579493e64880..4874937b57506cbb429adc80c8ceb6ff8a99000e 100644 (file)
@@ -35,6 +35,7 @@ class CommonProject
 
        # initialize
        def initialize( name, type, server, os_list )
+               @project_id = -1
                @name = name
                @type = type
                @passwd = ""
@@ -99,4 +100,14 @@ class CommonProject
                end
                return nil
        end
+
+
+       def set_project_id(id)
+               @project_id = id
+       end
+
+       
+       def get_project_id()
+               return @project_id
+       end
 end
index 64360746dc12ef8e935353446975e407358d3055..4181c7df2407563a08c8ff9a1e02b5631e7e8ba4 100644 (file)
@@ -27,6 +27,7 @@ Contributors:
 =end
 
 require 'fileutils'
+require 'sqlite3'
 $LOAD_PATH.unshift File.dirname(__FILE__)
 require "CommonProject.rb"
 require "GitBuildJob.rb"
@@ -40,7 +41,7 @@ class GitBuildProject < CommonProject
        attr_accessor :repository, :branch
 
        # initialize
-       def initialize( name, repos, branch, server, os_list )
+       def initialize( name, server, os_list, repos = nil, branch = nil )
                super(name, "GIT", server, os_list)
                @repository = repos 
                @branch = branch
@@ -176,4 +177,60 @@ class GitBuildProject < CommonProject
                return false
        end
 
+       def save_db()
+               config_file = "#{@server.path}/projects/#{@name}/build"
+               File.open( config_file, "w" ) do |f|
+                       f.puts "TYPE=GIT"
+                       f.puts "GIT_REPOSITORY=#{@repository}"
+                       f.puts "GIT_BRANCH=#{@branch}"
+               end
+       end
+
+       
+       def load_db()
+               # git
+               config_file = "#{@server.path}/projects/#{@name}/build"
+               repos="none"
+               branch="master"
+               File.open( config_file, "r" ) do |f|
+                       f.each_line do |l| 
+                               idx = l.index("=") + 1
+                               length = l.length - idx 
+
+                               if l.start_with?("GIT_REPOSITORY=")
+                                       repos = l[idx,length].strip
+                               elsif l.start_with?("GIT_BRANCH=")
+                                       branch = l[idx,length].strip
+                               else
+                                       next    
+                               end 
+                       end
+               end
+               @repository = repos
+               @branch = branch
+
+               # read source info
+               sources_file = "#{@server.path}/projects/#{@name}/sources"
+               if File.exist? sources_file then
+                       File.open(sources_file, "r") do |f|
+                               f.each_line do |l|
+                                       version = l.split(",")[0].strip
+                                       info = l.split(",")[1].strip
+
+                                       add_source_info( version, info )
+                               end
+                       end             
+               end
+       
+               # read pkginfo
+               pkginfo_dir = "#{@server.path}/projects/#{@name}/pkginfos"
+               if not File.exist? pkginfo_dir then FileUtils.mkdir_p pkginfo_dir end
+               Dir.new(pkginfo_dir).entries.each do |file|
+                       if file.eql? "." or file.eql? ".." then next end
+               
+                       vlen = file.length - ".manifest".length 
+                       version = file[0,vlen]
+                       add_package_info( version, "#{pkginfo_dir}/#{file}" )
+               end
+       end
 end
index 9d61df19bc817cb728b7a0ee367d6c15d90b0f12..0e444f119360731c7dbd91072165c54e62d9dfbb 100644 (file)
@@ -27,6 +27,7 @@ Contributors:
 =end
 
 require 'fileutils'
+require 'sqlite3'
 $LOAD_PATH.unshift File.dirname(__FILE__)
 require "GitBuildProject.rb"
 require "BinaryUploadProject.rb"
@@ -52,19 +53,8 @@ class ProjectManager
                        FileUtils.mkdir_p @project_root
                end
 
-               # scan all projects 
-               Dir.new(@project_root).entries.each do |name|
-                       # skip . or ..
-                       if name.eql? "." or name.eql? ".." then next end
-                               
-                       # create project
-                       @server.log.info "Loading project : #{name}"
-                       prj = load_project( name )
-                       if not prj.nil? then 
-                               @projects.push prj
-                       end
-               end
-
+               # load_data base
+               load_db()
        end
 
 
@@ -79,13 +69,17 @@ class ProjectManager
 
 
        def add_git_project(name , repos, branch, passwd, os_list)
+               load_db()
+
                prj = get_project( name)
                if not prj.nil? then return false end
                
-               new_prj = GitBuildProject.new(name, repos, branch, @server, os_list)
+               new_prj = GitBuildProject.new(name, @server, os_list, repos, branch)
                if not passwd.nil? and not passwd.empty? then
                        new_prj.passwd = passwd
                end
+               new_prj.repository = repos
+               new_prj.branch = branch
                @projects.push new_prj
 
                # check project directory
@@ -94,20 +88,23 @@ class ProjectManager
                end
 
                # write configuration
-               write_configuration(name, repos, branch, passwd, os_list)
+               save_db()
 
                return true
        end
 
 
        def add_binary_project(name, pkg_name, passwd, os_list)
+               load_db()
+
                prj = get_project( name)
                if not prj.nil? then return false end
                
-               new_prj = BinaryUploadProject.new(name, pkg_name, @server, os_list)
+               new_prj = BinaryUploadProject.new(name, @server, os_list, pkg_name)
                if not passwd.nil? and not passwd.empty? then
                        new_prj.passwd = passwd
                end
+               new_prj.pkg_name = pkg_name
                @projects.push new_prj
 
                # check project directory
@@ -115,8 +112,7 @@ class ProjectManager
                        FileUtils.mkdir_p "#{@project_root}/#{name}"
                end
 
-               # write configuration
-               write_configuration_for_binary_project(name, pkg_name, passwd, os_list)
+               save_db()
 
                return true
        end
@@ -233,6 +229,111 @@ class ProjectManager
                return get_project(name)        
        end
 
+       
+       # save
+       def save_db()
+               # generate project id if not exist?
+               last_id = -1
+               @projects.each { |prj|
+                       if prj.get_project_id() > last_id then last_id = prj.get_project_id() end
+               }
+               new_id = last_id + 1
+               @projects.each { |prj|
+                       if prj.get_project_id() == -1 then
+                               prj.set_project_id(new_id)
+                               new_id += 1
+                       end
+               }
+
+               db_file = "#{BuildServer::CONFIG_ROOT}/#{@server.id}/server.db" 
+               begin
+                       # open DB
+                       db = SQLite3::Database.open db_file
+                       db.results_as_hash = true
+                       
+                       # delete all rows
+                       db.execute "DELETE FROM projects"
+                       db.execute "DELETE FROM project_os"
+
+                       # insert  project info
+                       @projects.each { |prj|
+                               prj_id = prj.get_project_id()
+                               # COMMON
+                               db.execute "INSERT INTO projects VALUES(#{prj_id}, '#{prj.name}', '#{prj.type}', '#{prj.passwd}', 'BASE')"
+
+                               # OS
+                               prj.os_list.each { |os|
+                                       db.execute "INSERT INTO project_os VALUES('#{prj_id}','#{os}')"
+                               }
+
+                               prj.save_db()
+                       }
+               rescue SQLite3::Exception => e
+                       puts "DB update failed!"
+                       puts e
+               ensure
+                       db.close if db
+               end
+       end
+
+
+       # load
+       def load_db()
+               @project = []
+
+               db_file = "#{BuildServer::CONFIG_ROOT}/#{@server.id}/server.db" 
+               begin
+                       # open DB
+                       db = SQLite3::Database.open db_file
+                       db.results_as_hash = true
+
+                       # distributions
+                       stm = db.prepare "SELECT * FROM projects"
+                       rs = stm.execute
+                       stm2 = nil
+                       rs.each { |row|
+                               prj_id = row['id']
+                               prj_name = row['name']
+                               prj_type = row['type']
+                               prj_passwd = row['password']
+                               prj_dist = row['dist_name']
+
+                               @server.log.info "Loading project : #{prj_name}"
+                               # os
+                               prj_os_list = []
+                               stm2 = db.prepare "SELECT os_name FROM project_os WHERE prj_id = #{prj_id}"
+                               rs2 = stm2.execute
+                               rs2.each { |row2|
+                                       prj_os_list.push row2[0]
+                               }
+                               stm2.close if stm2
+                               stm2 = nil
+
+                               if prj_type == "GIT" then
+                                       new_project = GitBuildProject.new(prj_name, @server, prj_os_list)
+                               else
+                                       new_project = BinaryUploadProject.new(prj_name, @server, prj_os_list)
+                               end
+                               new_project.set_project_id(prj_id)
+
+                               if not prj_passwd.empty? then
+                                       new_project.passwd = prj_passwd
+                               end
+
+                               new_project.load_db()
+
+                               @projects.push new_project
+                       }
+               rescue SQLite3::Exception => e
+                       puts "DB loading failed!"
+                       puts e
+               ensure
+                       stm.close if stm
+                       stm2.close if stm2
+                       db.close if db
+               end
+       end
+
        protected
 
        # load and create project       
@@ -278,7 +379,7 @@ class ProjectManager
                # write back & create project
                if type == "GIT" then   
                        write_configuration(name, repos, branch, passwd, os_list)
-                       new_project = GitBuildProject.new(name, repos, branch, @server, os_list)
+                       new_project = GitBuildProject.new(name, @server, os_list, repos, branch)
 
                        # read source info
                        sources_file = "#{@project_root}/#{name}/sources"
@@ -306,7 +407,7 @@ class ProjectManager
 
                elsif type == "BINARY" then
                        write_configuration_for_binary_project(name, pkg_name, passwd, os_list)
-                       new_project = BinaryUploadProject.new(name, pkg_name, @server, os_list)
+                       new_project = BinaryUploadProject.new(name, @server, os_list, pkg_name)
                end
 
 
@@ -348,5 +449,4 @@ class ProjectManager
                end
        end
 
-
 end
index 5b294f60809456c66e63642e9081d5a38e1177bc..e307c191fe28e394c8f506d19895529fd00f635a 100755 (executable)
@@ -29,4 +29,4 @@ cd ..
 ../build-svr add-prj -n testserver3 -N teste -P bin
 ../build-svr add-prj -n testserver3 -N testa1 -g `pwd`/git01/a1 -b master
 ../pkg-svr register -n pkgsvr01 -d unstable -P bin/bin_0.0.0_ubuntu-32.zip
-../build-svr start -n testserver3 -p 2223
+../build-svr start -n testserver3 -p 2223 --CHILD