Esempio n. 1
0
        /// <summary>コンストラクタ</summary>
        /// <param name="dbms">DBMSの種類</param>
        /// <param name="convertString">文字列変換方法(空の場合は既定値を使用)</param>
        /// <param name="dateTimeFormatString">日付を文字列化する際に使用するFormatString</param>
        public SQLUtility(DbEnum.DBMSType dbms, string convertString, string dateTimeFormatString)
        {
            this._dbms = dbms;

            switch (this._dbms)
            {
                case DbEnum.DBMSType.SQLServer:

                    // convertString
                    if (string.IsNullOrEmpty(convertString))
                    {
                        // 既定値
                        this._convertString = "nvarchar";
                    }
                    else
                    {
                        // 指定の値
                        this._convertString = convertString;
                    }

                    // dateTimeFormatString
                    if (string.IsNullOrEmpty(dateTimeFormatString))
                    {
                        // 既定値
                        this._dateTimeFormatString = "yyyy/MM/dd HH:mm:ss.fff";
                    }
                    else
                    {
                        // 指定の値
                        this._dateTimeFormatString = dateTimeFormatString;
                    }

                    break;

                case DbEnum.DBMSType.PstGrS:

                    // convertString
                    if (string.IsNullOrEmpty(convertString))
                    {
                        // 既定値
                        this._convertString = "text";
                    }
                    else
                    {
                        // 指定の値
                        this._convertString = convertString;
                    }

                    // dateTimeFormatString
                    if (string.IsNullOrEmpty(dateTimeFormatString))
                    {
                        // 既定値
                        this._dateTimeFormatString = "yyyy/MM/dd HH:mm:ss.fff";
                    }
                    else
                    {
                        // 指定の値
                        this._dateTimeFormatString = dateTimeFormatString;
                    }

                    break;

                case DbEnum.DBMSType.Oracle:
                    // convertString
                    if (string.IsNullOrEmpty(convertString))
                    {
                        // 既定値
                        this._convertString = "varchar2";
                    }
                    else
                    {
                        // 指定の値
                        this._convertString = convertString;
                    }

                    // dateTimeFormatString
                    if (string.IsNullOrEmpty(dateTimeFormatString))
                    {
                        // 既定値
                        this._dateTimeFormatString = "dd-MMM-yyyy hh:mm:ss tt";
                    }
                    else
                    {
                        // 指定の値
                        this._dateTimeFormatString = dateTimeFormatString;
                    }

                    break;

                case DbEnum.DBMSType.MySQL:
                    // convertString
                    if (string.IsNullOrEmpty(convertString))
                    {
                        // 既定値
                        this._convertString = "char";
                    }
                    else
                    {
                        // 指定の値
                        this._convertString = convertString;
                    }

                    // dateTimeFormatString
                    if (string.IsNullOrEmpty(dateTimeFormatString))
                    {
                        // 既定値
                        this._dateTimeFormatString = "yyyy/MM/dd HH:mm:ss.fff";
                    }
                    else
                    {
                        // 指定の値
                        this._dateTimeFormatString = dateTimeFormatString;
                    }

                    break;

                case DbEnum.DBMSType.DB2:

                    // convertString
                    if (string.IsNullOrEmpty(convertString))
                    {
                        // 既定値
                        this._convertString = "varchar";
                    }
                    else
                    {
                        // 指定の値
                        this._convertString = convertString;
                    }

                    // dateTimeFormatString
                    if (string.IsNullOrEmpty(dateTimeFormatString))
                    {
                        // 既定値
                        this._dateTimeFormatString = "yyyy-MM-dd-HH.mm.ss.fff";
                    }
                    else
                    {
                        // 指定の値
                        this._dateTimeFormatString = dateTimeFormatString;
                    }
                    break;

                default:
                    throw new NotImplementedException(PublicExceptionMessage.NOT_IMPLEMENTED);
            }
        }
Esempio n. 2
0
        /// <summary>コンストラクタ</summary>
        /// <param name="dbms">DBMSの種類</param>
        /// <param name="convertString">文字列変換方法(空の場合は既定値を使用)</param>
        /// <param name="dateTimeFormatString">日付を文字列化する際に使用するFormatString</param>
        public SQLUtility(DbEnum.DBMSType dbms, string convertString, string dateTimeFormatString)
        {
            this._dbms = dbms;

            switch (this._dbms)
            {
            case DbEnum.DBMSType.SQLServer:

                // convertString
                if (string.IsNullOrEmpty(convertString))
                {
                    // 既定値
                    this._convertString = "nvarchar";
                }
                else
                {
                    // 指定の値
                    this._convertString = convertString;
                }

                // dateTimeFormatString
                if (string.IsNullOrEmpty(dateTimeFormatString))
                {
                    // 既定値
                    this._dateTimeFormatString = "yyyy/MM/dd HH:mm:ss.fff";
                }
                else
                {
                    // 指定の値
                    this._dateTimeFormatString = dateTimeFormatString;
                }

                break;

            case DbEnum.DBMSType.PstGrS:

                // convertString
                if (string.IsNullOrEmpty(convertString))
                {
                    // 既定値
                    this._convertString = "text";
                }
                else
                {
                    // 指定の値
                    this._convertString = convertString;
                }

                // dateTimeFormatString
                if (string.IsNullOrEmpty(dateTimeFormatString))
                {
                    // 既定値
                    this._dateTimeFormatString = "yyyy/MM/dd HH:mm:ss.fff";
                }
                else
                {
                    // 指定の値
                    this._dateTimeFormatString = dateTimeFormatString;
                }

                break;

            case DbEnum.DBMSType.Oracle:
                // convertString
                if (string.IsNullOrEmpty(convertString))
                {
                    // 既定値
                    this._convertString = "varchar2";
                }
                else
                {
                    // 指定の値
                    this._convertString = convertString;
                }

                // dateTimeFormatString
                if (string.IsNullOrEmpty(dateTimeFormatString))
                {
                    // 既定値
                    this._dateTimeFormatString = "dd-MMM-yyyy hh:mm:ss tt";
                }
                else
                {
                    // 指定の値
                    this._dateTimeFormatString = dateTimeFormatString;
                }

                break;

            case DbEnum.DBMSType.MySQL:
                // convertString
                if (string.IsNullOrEmpty(convertString))
                {
                    // 既定値
                    this._convertString = "char";
                }
                else
                {
                    // 指定の値
                    this._convertString = convertString;
                }

                // dateTimeFormatString
                if (string.IsNullOrEmpty(dateTimeFormatString))
                {
                    // 既定値
                    this._dateTimeFormatString = "yyyy/MM/dd HH:mm:ss.fff";
                }
                else
                {
                    // 指定の値
                    this._dateTimeFormatString = dateTimeFormatString;
                }

                break;

            case DbEnum.DBMSType.DB2:

                // convertString
                if (string.IsNullOrEmpty(convertString))
                {
                    // 既定値
                    this._convertString = "varchar";
                }
                else
                {
                    // 指定の値
                    this._convertString = convertString;
                }

                // dateTimeFormatString
                if (string.IsNullOrEmpty(dateTimeFormatString))
                {
                    // 既定値
                    this._dateTimeFormatString = "yyyy-MM-dd-HH.mm.ss.fff";
                }
                else
                {
                    // 指定の値
                    this._dateTimeFormatString = dateTimeFormatString;
                }
                break;

            default:
                throw new NotImplementedException(PublicExceptionMessage.NOT_IMPLEMENTED);
            }
        }
Esempio n. 3
0
 /// <summary>コンストラクタ</summary>
 /// <param name="dbms">DBMSの種類</param>
 /// <param name="convertString">文字列変換方法(空の場合は既定値を使用)</param>
 public SQLUtility(DbEnum.DBMSType dbms, string convertString)
     : this(dbms, convertString, "")
 {
 }
Esempio n. 4
0
 /// <summary>コンストラクタ</summary>
 /// <param name="dbms">DBMSの種類</param>
 public SQLUtility(DbEnum.DBMSType dbms)
     : this(dbms, "", "")
 {
 }
Esempio n. 5
0
        /// <summary>Main</summary>
        static void Main(string[] args)
        {
            //// Database connection using IDbCommand
            //IDbConnection dbConnection = null;
            //IDbCommand dbCommand = null;

            Dictionary <string, string> dic = null;
            List <string> list = null;

            PubCmnFunction.GetCommandArgs('/', out dic, out list);

            // Get the type of DB
            if (dic.ContainsKey("/DBMS"))
            {
                switch (dic["/DBMS"])
                {
                case "ODP":
                    Program._dbms = DbEnum.DBMSType.Oracle;
                    //dbConnection = new OracleConnection(GetConfigParameter.GetConfigValue("Oracle"));
                    break;

                case "DB2":
                    Program._dbms = DbEnum.DBMSType.DB2;
                    //dbConnection = new DB2Connection(GetConfigParameter.GetConfigValue("DB2Conn"));
                    break;

                case "MCN":
                    Program._dbms = DbEnum.DBMSType.MySQL;
                    //dbConnection = new MySqlConnection(GetConfigParameter.GetConfigValue("MySQLConn"));
                    break;

                case "NPS":
                    Program._dbms = DbEnum.DBMSType.PstGrS;
                    //dbConnection = new NpgsqlConnection(GetConfigParameter.GetConfigValue("PostgreSQLConn"));
                    break;

                default:
                    Program._dbms = DbEnum.DBMSType.SQLServer;
                    //dbConnection = new SqlConnection(GetConfigParameter.GetConfigValue("SQLServerConn"));
                    break;
                }
            }

            DataTable dt = null;
            DataRow   dr = null;

            try
            {
                #region Datatable creation

                dt = new DataTable("table1");

                dt.Columns.Add(new DataColumn("column1", typeof(string)));
                dt.Columns.Add(new DataColumn("column2", typeof(Int32)));
                dt.Columns.Add(new DataColumn("column3", typeof(byte[])));
                dt.Columns.Add(new DataColumn("column4", typeof(DateTime)));
                dt.Columns.Add(new DataColumn("column5", typeof(char)));
                dt.Columns.Add(new DataColumn("column6", typeof(string)));

                dr            = dt.NewRow();
                dr["column1"] = "test1";
                dr["column2"] = 1111;
                dr["column3"] = new byte[] { 1, 2, 3, 4, 5, 6 };
                dr["column4"] = DateTime.Now;
                dr["column5"] = DBNull.Value;
                dr["column6"] = string.Empty;
                dt.Rows.Add(dr);

                dr            = dt.NewRow();
                dr["column1"] = "test2";
                dr["column2"] = 22222;
                dt.Rows.Add(dr);

                dr            = dt.NewRow();
                dr["column1"] = "test3";
                dr["column2"] = 3;
                dr["column3"] = DBNull.Value;
                dr["column4"] = DBNull.Value;
                dr["column5"] = 'D';
                dr["column6"] = "Test's";
                dt.Rows.Add(dr);

                #endregion

                #region Generate SQL for batch process

                string[]      strs    = null;
                StringBuilder sb      = null;
                string        collist = "";
                string        temp    = "";
                string        query   = "";

                // Second and third argument optional.
                SQLUtility su = new SQLUtility(Program._dbms);

                #region Assembly of parts of SQL insert.

                // Forming insert query.
                strs = su.GetInsertSQLParts(dt);

                Console.WriteLine("<InsertSQLParts>");
                foreach (string str in strs)
                {
                    Console.WriteLine(str);
                }
                Console.WriteLine("\r\n");

                sb = new StringBuilder();

                // INSERT
                switch (Program._dbms)
                {
                case DbEnum.DBMSType.Oracle:
                    foreach (string str in strs)
                    {
                        if (string.IsNullOrEmpty(collist))
                        {
                            collist = str;
                            // for oracle: remove double quotes from the "column" name
                            collist = collist.Replace("\"", string.Empty);
                        }
                        else
                        {
                            sb.Append(str + ";");
                        }
                    }

                    // 最後のカンマを削る。
                    temp = sb.ToString();
                    temp = temp.Substring(0, temp.Length - 1);

                    string[]      temp2    = temp.Split(';');
                    StringBuilder sbOracle = new StringBuilder();
                    // Prepare Oracle Insert Statement to execute
                    sbOracle.Append("INSERT ALL ");
                    foreach (string str in temp2)
                    {
                        sbOracle.Append(string.Format(
                                            " INTO "
                                            + su.OpeningBracket + dt.TableName + su.ClosingBracket + " {0} "
                                            + " VALUES{1} \r\n", collist, str));
                    }

                    sbOracle.Append(" SELECT * FROM DUAL");
                    query = sbOracle.ToString();
                    break;

                case DbEnum.DBMSType.DB2:
                    //・・・
                    foreach (string str in strs)
                    {
                        if (string.IsNullOrEmpty(collist))
                        {
                            collist = str;
                            collist = collist.Replace("\"", string.Empty);
                        }
                        else
                        {
                            sb.Append(str + ",\r\n");
                        }
                    }

                    // Sharpen the last comma.
                    temp  = sb.ToString();
                    temp  = temp.Substring(0, temp.Length - 3);
                    query =
                        @"INSERT INTO "
                        + su.OpeningBracket + dt.TableName + su.ClosingBracket + collist
                        + "VALUES \r\n" + temp;
                    break;

                default:
                    // PostGreSQL
                    // MySQL
                    // SQLServer
                    // Preparing Insert query insert values.
                    foreach (string str in strs)
                    {
                        if (string.IsNullOrEmpty(collist))
                        {
                            collist = str;
                        }
                        else
                        {
                            sb.Append(str + ",\r\n");
                        }
                    }
                    // Sharpen the last comma.
                    temp = sb.ToString();
                    temp = temp.Substring(0, temp.Length - 3);

                    query =
                        @"INSERT INTO "
                        + su.OpeningBracket + dt.TableName + su.ClosingBracket + collist
                        + "VALUES \r\n" + temp;

                    break;
                }

                Console.WriteLine("<INSERT>");
                Console.WriteLine(query);
                Console.WriteLine("\r\n");

                #endregion

                #region Assembly of parts of SQL update.

                // Forming update query
                strs = su.GetUpdateSQLParts(dt, new string[] { "column1", "column2" });

                Console.WriteLine("<UpdateSQLParts>");
                foreach (string str in strs)
                {
                    Console.WriteLine(str);
                }
                Console.WriteLine("\r\n");

                sb = new StringBuilder();

                // UPDATE
                switch (Program._dbms)
                {
                case DbEnum.DBMSType.Oracle:
                    // Oracle
                    // To Run multiple sql statements in oracle from application we need to prepend "BEGIN" to the  Query
                    sb.Append("BEGIN ");
                    foreach (string s in strs)
                    {
                        string ss = s.Replace("\"", string.Empty);
                        //Add ";" at the end of each update statement
                        sb.Append(@"UPDATE " + su.OpeningBracket + dt.TableName + su.ClosingBracket + " " + ss + ";\r\n");
                    }
                    // To Run multiple sql statements in oracle from application we need to append "END;" to the Query
                    sb.Append("END;");
                    query = sb.ToString();
                    break;

                case DbEnum.DBMSType.DB2:
                    // To Run multiple sql statements in DB2 from an application we need to prepend "BEGIN" to the  Query
                    sb.Append("BEGIN ");
                    foreach (string s in strs)
                    {
                        //Add ";" at the end of each update statement to execute multiple update statements in DB2 datbase from .net
                        sb.Append(@"UPDATE " + su.OpeningBracket + dt.TableName + su.ClosingBracket + " " + s + ";\r\n");
                    }
                    // To Run multiple sql statements in DB2 from .net we need to append "END;" to the Query
                    sb.Append("END;");
                    query = sb.ToString();
                    query = query.Replace("\"", string.Empty);
                    break;

                default:
                    // PostGreSQL
                    // MySQL
                    // SQLServer
                    foreach (string s in strs)
                    {
                        sb.Append(@"UPDATE " + su.OpeningBracket + dt.TableName + su.ClosingBracket + " " + s + "\r\n");
                    }

                    query = sb.ToString();
                    break;
                }

                Console.WriteLine("<UPDATE>");
                Console.WriteLine(query);
                Console.WriteLine("\r\n");

                #endregion

                #endregion

                ////Executing queries using ADO.NET Icommand connection and command.
                //dbConnection.Open();
                //dbCommand = dbConnection.CreateCommand();
                //dbCommand.CommandText = query;
                //dbCommand.ExecuteNonQuery();

                Console.WriteLine("Query executed successfully");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Esempio n. 6
0
        /// <summary>Main</summary>
        static void Main(string[] args)
        {
            //// Database connection using IDbCommand
            //IDbConnection dbConnection = null;
            //IDbCommand dbCommand = null;

            Dictionary<string, string> dic = null;
            List<string> list = null;

            PubCmnFunction.GetCommandArgs('/', out dic, out list);

            // Get the type of DB
            if (dic.ContainsKey("/DBMS"))
            {
                switch (dic["/DBMS"])
                {
                    case "ODP":
                        Program._dbms = DbEnum.DBMSType.Oracle;
                        //dbConnection = new OracleConnection(GetConfigParameter.GetConfigValue("Oracle"));
                        break;
                    case "DB2":
                        Program._dbms = DbEnum.DBMSType.DB2;
                        //dbConnection = new DB2Connection(GetConfigParameter.GetConfigValue("DB2Conn"));
                        break;
                    case "MCN":
                        Program._dbms = DbEnum.DBMSType.MySQL;
                        //dbConnection = new MySqlConnection(GetConfigParameter.GetConfigValue("MySQLConn"));
                        break;
                    case "NPS":
                        Program._dbms = DbEnum.DBMSType.PstGrS;
                        //dbConnection = new NpgsqlConnection(GetConfigParameter.GetConfigValue("PostgreSQLConn"));
                        break;
                    default:
                        Program._dbms = DbEnum.DBMSType.SQLServer;
                        //dbConnection = new SqlConnection(GetConfigParameter.GetConfigValue("SQLServerConn"));
                        break;
                }
            }

            DataTable dt = null;
            DataRow dr = null;

            try
            {
                #region Datatable creation

                dt = new DataTable("table1");

                dt.Columns.Add(new DataColumn("column1", typeof(string)));
                dt.Columns.Add(new DataColumn("column2", typeof(Int32)));
                dt.Columns.Add(new DataColumn("column3", typeof(byte[])));
                dt.Columns.Add(new DataColumn("column4", typeof(DateTime)));
                dt.Columns.Add(new DataColumn("column5", typeof(char)));
                dt.Columns.Add(new DataColumn("column6", typeof(string)));

                dr = dt.NewRow();
                dr["column1"] = "test1";
                dr["column2"] = 1111;
                dr["column3"] = new byte[] { 1, 2, 3, 4, 5, 6 };
                dr["column4"] = DateTime.Now;
                dr["column5"] = DBNull.Value;
                dr["column6"] = string.Empty;
                dt.Rows.Add(dr);

                dr = dt.NewRow();
                dr["column1"] = "test2";
                dr["column2"] = 22222;
                dt.Rows.Add(dr);

                dr = dt.NewRow();
                dr["column1"] = "test3";
                dr["column2"] = 3;
                dr["column3"] = DBNull.Value;
                dr["column4"] = DBNull.Value;                
                dr["column5"] = 'D';
                dr["column6"] = "Test's";
                dt.Rows.Add(dr);

                #endregion

                #region Generate SQL for batch process

                string[] strs = null;
                StringBuilder sb = null;
                string collist = "";
                string temp = "";
                string query = "";

                // Second and third argument optional.
                SQLUtility su = new SQLUtility(Program._dbms);

                #region Assembly of parts of SQL insert.

                // Forming insert query.
                strs = su.GetInsertSQLParts(dt);

                Console.WriteLine("<InsertSQLParts>");
                foreach (string str in strs)
                {
                    Console.WriteLine(str);
                }
                Console.WriteLine("\r\n");

                sb = new StringBuilder();

                // INSERT
                switch (Program._dbms)
                {
                    case DbEnum.DBMSType.Oracle:
                        foreach (string str in strs)
                        {
                            if (string.IsNullOrEmpty(collist))
                            {
                                collist = str;
                                // for oracle: remove double quotes from the "column" name
                                collist = collist.Replace("\"", string.Empty);
                            }
                            else
                            {
                                sb.Append(str + ";");
                            }
                        }

                        // 最後のカンマを削る。
                        temp = sb.ToString();
                        temp = temp.Substring(0, temp.Length - 1);

                        string[] temp2 = temp.Split(';');
                        StringBuilder sbOracle = new StringBuilder();
                        // Prepare Oracle Insert Statement to execute
                        sbOracle.Append("INSERT ALL ");
                        foreach (string str in temp2)
                        {
                            sbOracle.Append(string.Format(
                                " INTO "
                                + su.OpeningBracket + dt.TableName + su.ClosingBracket + " {0} "
                                + " VALUES{1} \r\n", collist, str));
                        }

                        sbOracle.Append(" SELECT * FROM DUAL");
                        query = sbOracle.ToString();
                        break;

                    case DbEnum.DBMSType.DB2:
                        //・・・
                        foreach (string str in strs)
                        {
                            if (string.IsNullOrEmpty(collist))
                            {
                                collist = str;
                                collist = collist.Replace("\"", string.Empty);
                            }
                            else
                            {
                                sb.Append(str + ",\r\n");
                            }
                        }

                        // Sharpen the last comma.
                        temp = sb.ToString();
                        temp = temp.Substring(0, temp.Length - 3);
                        query =
                            @"INSERT INTO "
                            + su.OpeningBracket + dt.TableName + su.ClosingBracket + collist
                            + "VALUES \r\n" + temp;
                        break;

                    default:
                        // PostGreSQL
                        // MySQL
                        // SQLServer
                        // Preparing Insert query insert values.
                        foreach (string str in strs)
                        {
                            if (string.IsNullOrEmpty(collist))
                            {
                                collist = str;
                            }
                            else
                            {
                                sb.Append(str + ",\r\n");
                            }
                        }
                        // Sharpen the last comma.
                        temp = sb.ToString();
                        temp = temp.Substring(0, temp.Length - 3);

                        query =
                            @"INSERT INTO "
                            + su.OpeningBracket + dt.TableName + su.ClosingBracket + collist
                            + "VALUES \r\n" + temp;

                        break;
                }

                Console.WriteLine("<INSERT>");
                Console.WriteLine(query);
                Console.WriteLine("\r\n");

                #endregion

                #region Assembly of parts of SQL update.

                // Forming update query
                strs = su.GetUpdateSQLParts(dt, new string[] { "column1", "column2" });

                Console.WriteLine("<UpdateSQLParts>");
                foreach (string str in strs)
                {
                    Console.WriteLine(str);
                }
                Console.WriteLine("\r\n");

                sb = new StringBuilder();

                // UPDATE
                switch (Program._dbms)
                {
                    case DbEnum.DBMSType.Oracle:
                        // Oracle
                        // To Run multiple sql statements in oracle from application we need to prepend "BEGIN" to the  Query 
                        sb.Append("BEGIN ");
                        foreach (string s in strs)
                        {
                            string ss = s.Replace("\"", string.Empty);
                            //Add ";" at the end of each update statement
                            sb.Append(@"UPDATE " + su.OpeningBracket + dt.TableName + su.ClosingBracket + " " + ss + ";\r\n");
                        }
                        // To Run multiple sql statements in oracle from application we need to append "END;" to the Query
                        sb.Append("END;");
                        query = sb.ToString();
                        break;

                    case DbEnum.DBMSType.DB2:
                        // To Run multiple sql statements in DB2 from an application we need to prepend "BEGIN" to the  Query
                        sb.Append("BEGIN ");
                        foreach (string s in strs)
                        {
                            //Add ";" at the end of each update statement to execute multiple update statements in DB2 datbase from .net
                            sb.Append(@"UPDATE " + su.OpeningBracket + dt.TableName + su.ClosingBracket + " " + s + ";\r\n");
                        }
                        // To Run multiple sql statements in DB2 from .net we need to append "END;" to the Query
                        sb.Append("END;");
                        query = sb.ToString();
                        query = query.Replace("\"", string.Empty);
                        break;

                    default:
                        // PostGreSQL
                        // MySQL
                        // SQLServer
                        foreach (string s in strs)
                        {
                            sb.Append(@"UPDATE " + su.OpeningBracket + dt.TableName + su.ClosingBracket + " " + s + "\r\n");
                        }

                        query = sb.ToString();
                        break;
                }

                Console.WriteLine("<UPDATE>");
                Console.WriteLine(query);
                Console.WriteLine("\r\n");

                #endregion

                #endregion

                ////Executing queries using ADO.NET Icommand connection and command.
                //dbConnection.Open();
                //dbCommand = dbConnection.CreateCommand();
                //dbCommand.CommandText = query;
                //dbCommand.ExecuteNonQuery();

                Console.WriteLine("Query executed successfully");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }