Author: bendewey Date: Tue Sep 22 19:40:39 2009 New Revision: 817797 URL: http://svn.apache.org/viewvc?rev=817797&view=rev Log: STONEHENGE-53 (Part4) sorry Joby, missing Config and AssemblyInfo files
Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Config.cs incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Properties/ incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Properties/AssemblyInfo.cs Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Config.cs URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Config.cs?rev=817797&view=auto ============================================================================== --- incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Config.cs (added) +++ incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Config.cs Tue Sep 22 19:40:39 2009 @@ -0,0 +1,359 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// .Net StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications + + +//=============================================================================================== +// Customer is part of the SQLServer DAL for StockTrader. This is called from the +// BSL to execute commands against the database. It is constructed to use one SqlConnection per +// instance. Hence, BSLs that use this DAL should always be instanced properly. +// The DAL will work with both ADO.NET and System.Transactions or ServiceComponents/Enterprise +// Services attributed transactions [autocomplete]. When using ADO.NET transactions, +// The BSL will control the transaction boundaries with calls to dal.BeginTransaction(); +// dal.CommitTransaction(); dal.RollbackTransaction(). +//=============================================================================================== +//====================================================================================================== +// Code originally contributed by Microsoft Corporation. +// This contribution to the Stonehenge project is limited strictly +// to the source code that is submitted in this submission. +// Any technology, including underlying platform technology, +// that is referenced or required by the submitted source code +// is not a part of the contribution. +// For example and not by way of limitation, +// any systems/Windows libraries (WPF, WCF, ASP.NET etc.) +// required to run the submitted source code is not a part of the contribution +//====================================================================================================== + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Data; +using MySql.Data.MySqlClient; +using MySql.Data.Types; +using Trade.IDAL; +using Trade.Utility; +using Trade.ConfigServiceDataContract; + + +namespace Trade.DALMySQL +{ + public class Config : IConfig + { + public Config() + { + } + + //Constructor for internal DAL-DAL calls to use an existing DB connection. + public Config(MySqlConnection conn) + { + _internalConnection = conn; + } + + //_internalConnection: Used by a DAL instance such that a DAL instance, + //associated with a BSL instance, will work off a single connection between BSL calls. + private MySqlConnection _internalConnection; + + //_internalADOTransaction: Used only when doing ADO.NET transactions. + //This will be completely ignored when null, and not attached to a cmd object + //In MySQLHelper unless it has been initialized explicitly in the BSL with a + //dal.BeginADOTransaction(). See app config setting in web.config and + //Trade.BusinessServiceHost.exe.config "Use System.Transactions Globally" which determines + //whether user wants to run with ADO transactions or System.Transactions. The DAL itself + //is built to be completely agnostic and will work with either. + private MySqlTransaction _internalADOTransaction; + + //Used only when doing ADO.NET transactions. + public void BeginADOTransaction() + { + if (_internalConnection.State != ConnectionState.Open) + _internalConnection.Open(); + _internalADOTransaction = _internalConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); + } + + //Used only when explicitly using ADO.NET transactions from the BSL. + public void RollBackTransaction() + { + _internalADOTransaction.Rollback(); + _internalADOTransaction = null; + } + + //Used only when explicitly using ADO.NET transactions from the BSL. + public void CommitADOTransaction() + { + _internalADOTransaction.Commit(); + _internalADOTransaction = null; + } + + public void Open(string connString) + { + if (_internalConnection == null) + _internalConnection = new MySqlConnection(connString); + if (_internalConnection.State != ConnectionState.Open) + _internalConnection.Open(); + } + + public void Close() + { + if (_internalConnection != null && _internalConnection.State != ConnectionState.Closed) + _internalConnection.Close(); + } + + private const string PARM_CLIENT = "?Client"; + private const string PARM_BS = "?Bs"; + private const string PARM_OPS = "?Ops"; + private const string PARM_URL = "?Url"; + private const string PARM_SERVICENAME = "?ServiceName"; + private const string PARM_SEC = "?Sec"; + + + //SQL Queries to lookup configuration info for given services + private const string MYSQL_GET_CLIENT_CONFIG = @"SELECT c.BS, s.URL, s.SEC FROM clienttobs c INNER JOIN service s ON c.BS = s.SERVICENAME WHERE c.CLIENT = ?Client"; + private const string MYSQL_GET_BS_CONFIG = @"SELECT b.OPS, b.URL, b.SEC, d.DBNAME, d.HOSTNAME, d.PORT FROM (SELECT 1 as Row, b1.OPS, s.URL, s.SEC FROM BSTOOPS as b1 INNER JOIN SERVICE AS s ON b1.OPS = s.SERVICENAME WHERE b1.BS = ?Bs) as b INNER JOIN (SELECT 1 as Row, DBNAME, HOSTNAME, PORT FROM DBCONFIG WHERE ACTIVE='Y') as d ON b.Row = d.Row"; + private const string MYSQL_GET_OPS_CONFIG = @"SELECT DBNAME, HOSTNAME, PORT FROM DBCONFIG WHERE ACTIVE='Y'"; + private const string MYSQL_FIND_CLIENT_TO_BS = @"SELECT b.CLIENT, b.BS FROM CLIENTTOBS as b WHERE b.CLIENT = ?Client"; + private const string MYSQL_SET_CLIENT_TO_BS = @"INSERT INTO CLIENTTOBS (CLIENT, BS) VALUES (?Client, ?Bs)"; + private const string MYSQL_UPDATE_CLIENT_TO_BS = @"UPDATE CLIENTTOBS SET BS=?Bs WHERE CLIENT=?Client"; + private const string MYSQL_FIND_BS_TO_OPS = @"SELECT b.BS, b.OPS FROM BSTOOPS as b WHERE b.BS = ?Bs"; + private const string MYSQL_FIND_SERVICE = @"SELECT SERVICENAME, URL, SEC FROM SERVICE WHERE SERVICENAME = ?ServiceName"; + private const string MYSQL_SET_BS_TO_OPS = @"INSERT INTO BSTOOPS (BS, OPS) VALUES (?Bs, ?Ops)"; + private const string MYSQL_UPDATE_BS_TO_OPS = @"UPDATE BSTOOPS SET OPS=?Ops WHERE BS=?Bs"; + private const string MYSQL_COUNT_BS = @"SELECT COUNT(*) as count FROM SERVICE WHERE SERVICENAME LIKE '%_BS' OR SERVICENAME LIKE '%_BSSEC'"; + private const string MYSQL_COUNT_OPS = @"SELECT COUNT(*) as count FROM SERVICE WHERE SERVICENAME LIKE '%_OPS' OR SERVICENAME LIKE '%_OPSSEC'"; + private const string MYSQL_GET_BS = @"SELECT SERVICENAME, URL, SEC FROM SERVICE WHERE SERVICENAME LIKE '%_BS' OR SERVICENAME LIKE '%_BSSEC'"; + private const string MYSQL_GET_OPS = @"SELECT SERVICENAME, URL, SEC FROM SERVICE WHERE SERVICENAME LIKE '%_OPS' OR SERVICENAME LIKE '%_OPSSEC'"; + private const string MYSQL_UPDATE_SERVICE_LOCATION = @"UPDATE SERVICE SET URL = ?Url, SEC = ?Sec WHERE SERVICENAME = ?ServiceName"; + private const string MYSQL_INSERT_SERVICE_LOCATION = @"INSERT INTO SERVICE (SERVICENAME, URL, SEC) VALUES (?ServiceName, ?Url, ?Sec)"; + + /// <summary> + /// Looks for a service location with the given ServiceName in the database. If found, + /// the URL and SEC values are updated. If not found, a new service location is inserted. + /// </summary> + /// <param name="location">Service Location consisting on a Service Name, URL and SEC value</param> + public void SetServiceLocation(ServiceLocation location) + { + MySqlParameter[] parm = new MySqlParameter[] { new MySqlParameter(PARM_SERVICENAME, MySqlDbType.VarChar, 50) }; + parm[0].Value = location.ServiceName; + + MySqlParameter[] parm2 = new MySqlParameter[] { new MySqlParameter(PARM_SERVICENAME, MySqlDbType.VarChar, 50), new MySqlParameter(PARM_URL, MySqlDbType.VarChar, 500), new MySqlParameter(PARM_SEC, MySqlDbType.Bit) }; + parm2[0].Value = location.ServiceName; + parm2[1].Value = location.ServiceURL; + parm2[2].Value = location.Sec; + + MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRow(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_FIND_SERVICE, parm); + if (!rdr.Read()) + { + rdr.Close(); + MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_INSERT_SERVICE_LOCATION, parm2); + } + else + { + rdr.Close(); + MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_UPDATE_SERVICE_LOCATION, parm2); + } + } + + /// <summary> + /// Looks up the given Client Service Name in the CLIENTTOBS table in the database + /// for information regarding configuration - of the Business Service and the DB + /// </summary> + /// <param name="bs">Name of the Order Processing Service</param> + /// <returns>ClientConfigResponse object with config information on the BSuri and DB connection info. or null if the given ClientName is not in the database</returns> + public ClientConfigResponse GetClientConfig(string client) + { + MySqlParameter[] parm = new MySqlParameter[] { new MySqlParameter(PARM_CLIENT, MySqlDbType.VarChar, 50) }; + parm[0].Value = client; + MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRow(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_GET_CLIENT_CONFIG, parm); + + // Read and Guard + if (!rdr.Read()) + return null; + + var response = new ClientConfigResponse(); + response.BS = rdr.GetString(rdr.GetOrdinal("URL")); + response.BSName = rdr.GetString(rdr.GetOrdinal("BS")); + response.Sec = ConvertStringToBool(rdr["SEC"] as string); + + rdr.Close(); + + return response; + } + + /// <summary> + /// Looks up the given Business Service Name in the BSTOOPS table in the database + /// for information regarding configuration - of the Order Processing Service and the DB + /// </summary> + /// <param name="bs">Name of the Buiness Service</param> + /// <returns>BSConfigResponse object with config information on the OPSuri and DB connection info, or null if the given BSName is not in the database</returns> + public BSConfigResponse GetBSConfig(string bs) + { + MySqlParameter[] parm = new MySqlParameter[] { new MySqlParameter(PARM_BS, MySqlDbType.VarChar, 50) }; + parm[0].Value = bs; + MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRow(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_GET_BS_CONFIG, parm); + + // Read and Gaurd + if (!rdr.Read()) + return null; + + var response = new BSConfigResponse(); + response.OPS = rdr.GetString(rdr.GetOrdinal("URL")); + response.OPSName = rdr.GetString(rdr.GetOrdinal("OPS")); + response.Sec = ConvertStringToBool(rdr["SEC"] as string); + response.DBName = rdr.GetString(rdr.GetOrdinal("DBNAME")); + response.DBHostName = rdr.GetString(rdr.GetOrdinal("HOSTNAME")); + response.DBPort = rdr.GetInt32(rdr.GetOrdinal("PORT")); + + rdr.Close(); + + return response; + } + + /// <summary> + /// Finds the database configuration information from DBCONFIG for the Order Processing Service + /// </summary> + /// <param name="bs">Name of the Order Processing Service</param> + /// <returns>OPSConfigResponse object with config information on the DB connection info</returns> + public OPSConfigResponse GetOPSConfig(string ops) + { + MySqlDataReader rdr = MySQLHelper.ExecuteReaderNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_GET_OPS_CONFIG); + + // Read and Gaurd + if (!rdr.Read()) + return null; + + var response = new OPSConfigResponse(); + response.DBName = rdr.GetString(rdr.GetOrdinal("DBNAME")); + response.DBHostName = rdr.GetString(rdr.GetOrdinal("HOSTNAME")); + response.DBPort = rdr.GetInt32(rdr.GetOrdinal("PORT")); + + rdr.Close(); + + return response; + } + + /// <summary> + /// Sets a connection between the specified client and business service + /// If no ClientToBS configuration entry exists for this client, it is created + /// or else the configuration for the client is replaced by this one + /// </summary> + public void SetClientToBS(ClientToBS clientConfig) + { + MySqlParameter[] parm = new MySqlParameter[] { new MySqlParameter(PARM_CLIENT, MySqlDbType.VarChar, 50) }; + parm[0].Value = clientConfig.Client; + + MySqlParameter[] parm2 = new MySqlParameter[] { new MySqlParameter(PARM_CLIENT, MySqlDbType.VarChar, 50), new MySqlParameter(PARM_BS, MySqlDbType.VarChar, 50) }; + parm2[0].Value = clientConfig.Client; + parm2[1].Value = clientConfig.Bs; + + MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRow(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_FIND_CLIENT_TO_BS, parm); + if (!rdr.Read()) + { + rdr.Close(); + MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_SET_CLIENT_TO_BS, parm2); + } + else + { + rdr.Close(); + MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_UPDATE_CLIENT_TO_BS, parm2); + } + } + + /// <summary> + /// Sets a connection between the specified client and business service + /// If no ClientToBS configuration entry exists for this client, it is created + /// or else the configuration for the client is replaced by this one + /// </summary> + public void SetBSToOPS(BSToOPS bsConfig) + { + MySqlParameter[] parm = new MySqlParameter[] { new MySqlParameter(PARM_BS, MySqlDbType.VarChar, 50) }; + parm[0].Value = bsConfig.Bs; + + MySqlParameter[] parm2 = new MySqlParameter[] { new MySqlParameter(PARM_BS, MySqlDbType.VarChar, 50), new MySqlParameter(PARM_OPS, MySqlDbType.VarChar, 50) }; + parm2[0].Value = bsConfig.Bs; + parm2[1].Value = bsConfig.Ops; + + MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRow(_internalConnection, _internalADOTransaction, CommandType.Text, + MYSQL_FIND_BS_TO_OPS, parm); + if (!rdr.Read()) + { + rdr.Close(); + MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_SET_BS_TO_OPS, parm2); + } + else + { + rdr.Close(); + MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_UPDATE_BS_TO_OPS, parm2); + } + } + + public ServiceLocation[] GetBSLocations() + { + int count = (int)MySQLHelper.ExecuteScalarNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_COUNT_BS); + ServiceLocation[] bsLocations = new ServiceLocation[count]; + MySqlDataReader rdr = MySQLHelper.ExecuteReader(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_GET_BS); + int i = 0; + while (rdr.Read()) + { + bsLocations[i] = new ServiceLocation(); + bsLocations[i].ServiceName = (string)rdr["SERVICENAME"]; + bsLocations[i].ServiceURL = (string)rdr["URL"]; + bsLocations[i].Sec = ConvertStringToBool(rdr["SEC"] as string); + i++; + } + + return bsLocations; + } + + public ServiceLocation[] GetOPSLocations() + { + + int count = (int)MySQLHelper.ExecuteScalarNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_COUNT_OPS); + ServiceLocation[] opsLocations = new ServiceLocation[count]; + MySqlDataReader rdr = MySQLHelper.ExecuteReader(_internalConnection, _internalADOTransaction, CommandType.Text, MYSQL_GET_OPS); + + int i = 0; + while (rdr.Read()) + { + opsLocations[i] = new ServiceLocation(); + opsLocations[i].ServiceName = (string)rdr["SERVICENAME"]; + opsLocations[i].ServiceURL = (string)rdr["URL"]; + opsLocations[i].Sec = ConvertStringToBool(rdr["SEC"] as string); + i++; + } + + return opsLocations; + } + + private bool ConvertStringToBool(string value) + { + if (value == null) + return false; + + return value.Equals("Y", StringComparison.InvariantCultureIgnoreCase); + } + + + } +} Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Properties/AssemblyInfo.cs URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Properties/AssemblyInfo.cs?rev=817797&view=auto ============================================================================== --- incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Properties/AssemblyInfo.cs (added) +++ incubator/stonehenge/trunk/stocktrader/dotnet/common/DALMySQL/Properties/AssemblyInfo.cs Tue Sep 22 19:40:39 2009 @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Trade.DALMySQL")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Apache Stonehenge")] +[assembly: AssemblyProduct(".NET StockTrader")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3db23d09-a380-4d1f-877d-66a4fb7f53be")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")]