现在的位置: 首页 > 综合 > 正文

Discuz!NT代码阅读笔记(3)–网站安装也能自动化:DNT安装时使用到的几个函数解析

2013年01月30日 ⁄ 综合 ⁄ 共 5899字 ⁄ 字号 评论关闭

 

相关链接:

Discuz!NT代码阅读笔记(1)--从HttpModule开始

Discuz!NT代码阅读笔记(2)--网站安装也能自动化:论坛程序安装及初始化过程

  

前文提到:

DNT安装项目:Discuz.Install中,有9CS文件。其中位于SetupPage.cs.文件中的SetupPage类是继承自System.Web.UI.Page。它是其安装过程中用到的其他页面类的基类。

SetupPage的构造函数中,程序组织了一些版权、版本等文本的Html。但在整个安装过程中,我没看见这些信息。

安装时,由于Index.Aspx没有隐藏任何类的信息,可以当作静态页面来看待。

安装过程中的第二和第三个页面完成信息收集工作,之后在第四个页面自信数据库脚本创建存储过程和表。前两个页面基层之文件step3.aspx.cs中的install类,最后一个页面基层自step4.aspx.cs文件中的InstallStep4类。这篇就说说安装过程中用到的几个有意思函数。

1、安装前软件BIN目录检测函数IISSystemBINCheck()

         这个函数位于SetupPage类中,检查程序依赖的DLL是否都存在。通过File.Exists()判断文件是否存在。

2、检查对程序目录的读写权限函数SystemFolderCheck()

     这个函数通过在程序主目录下创建一个文件,之后再删除这个文件来检查对程序根目录的读写权限

3、检查对操作系统临时目录的读写权限函数TempTest()

        private static bool TempTest()

        {

            string UserGuid = Guid.NewGuid().ToString();

            string TempPath = Path.GetTempPath();

            string path = TempPath + UserGuid;

            try

            {

                using (StreamWriter sw = new StreamWriter(path))

                {

                    sw.WriteLine(DateTime.Now);

                }

                using (StreamReader sr = new StreamReader(path))

                {

                    sr.ReadLine();

                    return true;

                }

            }

            catch

            {

                return false;

            }

        }

     这个函数首先通过System.IO中的Path.GetTempPath();函数获取系统历史文件目录,之后使用Guid.NewGuid().ToString()在临时目录下随机生成一个文件目录名并创建一个文件,在文件中追加一行数据并读取,以测试对临时目录的权限。

4、配置文件编辑函数EditDntConfig()

        protected void EditDntConfig(string dataSource, string userID, string password, string databaseName, string tablePrefix)

        {

            BaseConfigInfo baseConfig = BaseConfigs.GetBaseConfig();

            connectionString = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Catalog={3};Pooling=true",

                                             dataSource, userID, password, databaseName);

            baseConfig.Dbconnectstring = connectionString;

            baseConfig.Tableprefix = tablePrefix;

            baseConfig.Dbtype = "SqlServer";

            string dntPath = Utils.GetMapPath("~/DNT.config");

            if (!Utils.FileExists(dntPath))

            {

                dntPath = Utils.GetMapPath("/DNT.config");

            }

            SerializationHelper.Save(baseConfig, dntPath);

            DbHelper.ConnectionString = baseConfig.Dbconnectstring;

            BaseConfigs.ResetRealConfig();

        }

         编辑网站根目录下DNT.Config文件使用。通过传入的参数,组织了连接字符串即:

            connectionString = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Catalog={3};Pooling=true",

                                             dataSource, userID, password, databaseName);

然后将这个字符串保存到网站目录下的DNT.Config文件中。

5、检测数据库是否存在函数CheckDatabaseExists()

        protected int CheckDatabaseExists()

        {

            int result = 0;

            try

            {

                connectionString = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Catalog={3};Pooling=false",

                                          Request.QueryString["sql_ip"], Request.QueryString["sql_username"], Request.QueryString["sql_password"], Request.QueryString["sql_name"]);

                commandText = string.Format("SELECT DB_ID('{0}')", Request.QueryString["sql_name"]);

                result = ExcuteReader(commandText, connectionString);

                //EditDntConfig(Request["sql_ip"], Request["sql_username"], Request["sql_password"], Request["sql_name"], Request["table_prefix"]);//执行成功后,将数据库连接信息写入DNT.config文件

            }

            catch (Exception)

            {

                Response.Write("{\"Result\":false,\"Message\":\"数据库不存在!请重新填写;或者选择自动创建数据库\"}");

                Response.End();

                return result;

            }

            if (result == 0)

            {

                Response.Write("{\"Result\":false,\"Message\":\"数据库不存在!请重新填写;或者选择自动创建数据库\"}");

                Response.End();

                return result;

            }

            else

            {

                Response.Write("{\"Result\":true,\"Message\":true}");

                Response.End();

                return result;

            }

        }

这个函数通过try{} catch{} 测试是否能连接到数据库。在Try中,根据用户输入信息组织一条语句,并在数据库中执行。如果能够执行,说明数据库连接正常。否则抛出异常,有Catch完成异常信息的显示和输出。

6、读取数据库脚本并执行的函数:CreateTableAndSP()

       /// <summary>

       /// 建表和存储过程

       /// </summary>

       private void CreateTableAndSP()

       {

           tableprefix = BaseConfigs.GetTablePrefix;

           #region 建表

           StringBuilder sb = new StringBuilder();

           using (StreamReader objReader = new StreamReader(Server.MapPath(dbScriptPath + "setup2.1.sql"), Encoding.UTF8))

           {

               sb.Append(objReader.ReadToEnd());

               objReader.Close();

           }

 

           if (tableprefix.ToLower() == "dnt_")

           {

               DbHelper.ExecuteCommandWithSplitter(sb.ToString());

           }

           else

           {

               DbHelper.ExecuteCommandWithSplitter(sb.ToString().Replace("dnt_", tableprefix));

               //DbHelper.ExecuteNonQuery(sb.ToString().Replace("dnt_",tableprefix));

           }

           #endregion

 

           #region 建存储过程

           sb.Remove(0, sb.Length);  //StringBuild内容清空

           sqlServerVersion = DbHelper.ExecuteScalar(CommandType.Text, "SELECT @@VERSION").ToString().Substring(20, 24).Trim();

           if (sqlServerVersion.IndexOf("2000") >= 0)

           {

               using (StreamReader objReader = new StreamReader(Server.MapPath(dbScriptPath + "setup2.2.sql"), Encoding.UTF8))

               {

                   sb.Append(objReader.ReadToEnd());

                   objReader.Close();

               }

           }

           else

           {

               using (StreamReader objReader = new StreamReader(Server.MapPath(dbScriptPath + "setup2.2 - 2005.sql"), Encoding.UTF8))

               {

                   sb.Append(objReader.ReadToEnd());

                   objReader.Close();

               }

           }

           if (tableprefix.ToLower() == "dnt_")

           {

               DbHelper.ExecuteCommandWithSplitter(sb.ToString().Trim().Replace("\"", "'"));

           }

           else

           {

               DbHelper.ExecuteCommandWithSplitter(sb.ToString().Trim().Replace("\"", "'").Replace("dnt_", tableprefix));

           }

抱歉!评论已关闭.