示例#1
0
 void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length)
 {
     byte[] array = null;
     try
     {
         array = ((MySqlGeometry)val)._valBinary;
     }
     catch
     {
         array = (val as byte[]);
     }
     if (array == null)
     {
         MySqlGeometry mySqlGeometry = new MySqlGeometry(0.0, 0.0);
         MySqlGeometry.TryParse(val.ToString(), out mySqlGeometry);
         array = mySqlGeometry._valBinary;
     }
     byte[] array2 = new byte[25];
     for (int i = 0; i < array.Length; i++)
     {
         if (array.Length < 25)
         {
             array2[i + 4] = array[i];
         }
         else
         {
             array2[i] = array[i];
         }
     }
     packet.WriteStringNoNull("_binary ");
     packet.WriteByte(39);
     MySqlGeometry.EscapeByteArray(array2, 25, packet);
     packet.WriteByte(39);
 }
    public override string AsText(DbGeometry geometryValue)
    {
      if (geometryValue == null)
        throw new ArgumentNullException("geometryValue");

      var providerValue = new MySqlGeometry();
      MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue);

      return providerValue.ToString();
    }
示例#3
0
        public static bool TryParse(string value, out MySqlGeometry mySqlGeometryValue)
        {
            string[] array  = new string[0];
            string   text   = string.Empty;
            bool     flag   = false;
            bool     flag2  = false;
            double   xValue = 0.0;
            double   yValue = 0.0;
            int      srid   = 0;

            try
            {
                if (value.Contains(";"))
                {
                    array = value.Split(new char[]
                    {
                        ';'
                    });
                }
                else
                {
                    text = value;
                }
                if (array.Length > 1 || text != string.Empty)
                {
                    string text2 = (text != string.Empty) ? text : array[1];
                    text2 = text2.Replace("POINT (", "").Replace("POINT(", "").Replace(")", "");
                    string[] array2 = text2.Split(new char[]
                    {
                        ' '
                    });
                    if (array2.Length > 1)
                    {
                        flag  = double.TryParse(array2[0], out xValue);
                        flag2 = double.TryParse(array2[1], out yValue);
                    }
                    if (array.Length >= 1)
                    {
                        int.TryParse(array[0].Replace("SRID=", ""), out srid);
                    }
                }
                if (flag && flag2)
                {
                    mySqlGeometryValue = new MySqlGeometry(xValue, yValue, srid);
                    return(true);
                }
            }
            catch
            {
            }
            mySqlGeometryValue = new MySqlGeometry(true);
            return(false);
        }
示例#4
0
        public static MySqlGeometry Parse(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                throw new ArgumentNullException("value");
            }
            if (!value.Contains("SRID") && !value.Contains("POINT(") && !value.Contains("POINT ("))
            {
                throw new FormatException("String does not contain a valid geometry value");
            }
            MySqlGeometry result = new MySqlGeometry(0.0, 0.0);

            MySqlGeometry.TryParse(value, out result);
            return(result);
        }
示例#5
0
        /// <summary>
        /// Try to get value from WKT format
        /// SRID=0;POINT (x y) or POINT (x y)
        /// </summary>
        /// <param name="value">WKT string format</param>
        public static bool TryParse(string value, out MySqlGeometry mySqlGeometryValue)
        {
            string[] arrayResult = new string[0];
            string   strResult   = string.Empty;
            bool     hasX        = false;
            bool     hasY        = false;
            Double   xVal        = 0;
            Double   yVal        = 0;
            int      sridValue   = 0;

            try
            {
                if (value.Contains(";"))
                {
                    arrayResult = value.Split(';');
                }
                else
                {
                    strResult = value;
                }

                if (arrayResult.Length > 1 || strResult != String.Empty)
                {
                    string point = strResult != String.Empty ? strResult : arrayResult[1];
                    point = point.Replace("POINT (", "").Replace("POINT(", "").Replace(")", "");
                    var coord = point.Split(' ');
                    if (coord.Length > 1)
                    {
                        hasX = Double.TryParse(coord[0], out xVal);
                        hasY = Double.TryParse(coord[1], out yVal);
                    }
                    if (arrayResult.Length >= 1)
                    {
                        Int32.TryParse(arrayResult[0].Replace("SRID=", ""), out sridValue);
                    }
                }
                if (hasX && hasY)
                {
                    mySqlGeometryValue = new MySqlGeometry(xVal, yVal, sridValue);
                    return(true);
                }
            }
            catch
            {  }

            mySqlGeometryValue = new MySqlGeometry(true);
            return(false);
        }
    public override DbGeometry GetGeometry(int ordinal)
    {
      ReturnGeometryColumn(ordinal);

      var geometryBytes = this.reader.GetValue(ordinal);
      Type t = geometryBytes.GetType();

      object geometry = Activator.CreateInstance(t);

      var providerValue = new MySqlGeometry();

      MySqlGeometry.TryParse(geometryBytes.ToString(), out providerValue);      

      return MySqlSpatialServices.Instance.GeometryFromProviderValue(providerValue);
      
    }
示例#7
0
        IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal)
        {
            MySqlGeometry mySqlGeometry;

            if (nullVal)
            {
                mySqlGeometry = new MySqlGeometry(this._type, true);
            }
            else
            {
                if (length == -1L)
                {
                    length = packet.ReadFieldLength();
                }
                byte[] array = new byte[length];
                packet.Read(array, 0, (int)length);
                mySqlGeometry = new MySqlGeometry(this._type, array);
            }
            return(mySqlGeometry);
        }
示例#8
0
        IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal)
        {
            MySqlGeometry g;

            if (nullVal)
            {
                g = new MySqlGeometry(_type, true);
            }
            else
            {
                if (length == -1)
                {
                    length = (long)packet.ReadFieldLength();
                }

                byte[] newBuff = new byte[length];
                packet.Read(newBuff, 0, (int)length);
                g = new MySqlGeometry(_type, newBuff);
            }
            return(g);
        }
示例#9
0
        void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length)
        {
            byte[] buffToWrite = null;

            try
            {
                buffToWrite = ((MySqlGeometry)val)._valBinary;
            }
            catch
            {
                buffToWrite = val as Byte[];
            }

            if (buffToWrite == null)
            {
                MySqlGeometry v = new MySqlGeometry(0, 0);
                MySqlGeometry.TryParse(val.ToString(), out v);
                buffToWrite = v._valBinary;
            }

            byte[] result = new byte[GEOMETRY_LENGTH];

            for (int i = 0; i < buffToWrite.Length; i++)
            {
                if (buffToWrite.Length < GEOMETRY_LENGTH)
                {
                    result[i + 4] = buffToWrite[i];
                }
                else
                {
                    result[i] = buffToWrite[i];
                }
            }

            packet.WriteStringNoNull("_binary ");
            packet.WriteByte((byte)'\'');
            EscapeByteArray(result, GEOMETRY_LENGTH, packet);
            packet.WriteByte((byte)'\'');
        }
        /// <summary>
        /// Try to get value from WKT format
        /// SRID=0;POINT (x y) or POINT (x y)
        /// </summary>
        /// <param name="value">WKT string format</param>    
        public static bool TryParse(string value, out MySqlGeometry mySqlGeometryValue)
        {
            string[] arrayResult = new string[0];
              string strResult = string.Empty;
              bool hasX = false;
              bool hasY = false;
              Double xVal = 0;
              Double yVal = 0;
              int sridValue = 0;

              try
              {
            if (value.Contains(";"))
              arrayResult = value.Split(';');
            else
              strResult = value;

            if (arrayResult.Length > 1 || strResult != String.Empty)
            {
              string point = strResult != String.Empty ? strResult : arrayResult[1];
              point = point.Replace("POINT (", "").Replace("POINT(", "").Replace(")", "");
              var coord = point.Split(' ');
              if (coord.Length > 1)
              {
            hasX = Double.TryParse(coord[0], out xVal);
            hasY = Double.TryParse(coord[1], out yVal);
              }
              if (arrayResult.Length >= 1)
            Int32.TryParse(arrayResult[0].Replace("SRID=", ""), out sridValue);
            }
            if (hasX && hasY)
            {
              mySqlGeometryValue = new MySqlGeometry(xVal, yVal, sridValue);
              return true;
            }
              }
              catch
              {  }

              mySqlGeometryValue = new MySqlGeometry(true);
              return false;
        }
示例#11
0
 public MySqlGeometry(double xValue, double yValue)
 {
     this = new MySqlGeometry(MySqlDbType.Geometry, xValue, yValue, 0);
 }
示例#12
0
 public MySqlGeometry(double xValue, double yValue, int srid)
 {
     this = new MySqlGeometry(MySqlDbType.Geometry, xValue, yValue, srid);
 }
        public void CanSaveSridValueOnGeometry()
        {
            if (version.Major < 5) return;

              execSQL("DROP TABLE IF EXISTS Test");
              execSQL("CREATE TABLE Test (v Geometry NOT NULL)");

              MySqlGeometry v = new MySqlGeometry(47.37, -122.21, 101);
              var par = new MySqlParameter("?v", MySqlDbType.Geometry);
              par.Value = v;

              MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", conn);
              cmd.Parameters.Add(par);
              cmd.ExecuteNonQuery();

              cmd.CommandText = "SELECT SRID(v) FROM Test";

              using (MySqlDataReader reader = cmd.ExecuteReader())
              {
            reader.Read();
            var val = reader.GetString(0);
            Assert.AreEqual("101", val);
              }
        }
示例#14
0
 public MySqlGeometry(bool isNull)
 {
     this = new MySqlGeometry(MySqlDbType.Geometry, isNull);
 }
 public void CanTryParseGeometryValueStringWithSRIDValue()
 {
     var mysqlGeometryResult = new MySqlGeometry(0, 0);
       MySqlGeometry.TryParse("SRID=101;POINT (47.37 -122.21)", out mysqlGeometryResult);
       Assert.AreEqual("SRID=101;POINT(47.37 -122.21)", mysqlGeometryResult.ToString());
 }
 public void CanTryParseGeometryValueString()
 {
     MySqlGeometry v = new MySqlGeometry(0, 0);
       MySqlGeometry.TryParse("POINT (47.37 -122.21)", out v);
       Assert.AreEqual("POINT(47.37 -122.21)", v.ToString());
 }
        void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length)
        {
            byte[] buffToWrite = null;

              try
              {
            buffToWrite = ((MySqlGeometry)val)._valBinary;
              }
              catch
              {
            buffToWrite = val as Byte[];
              }

              if (buffToWrite == null)
              {
            MySqlGeometry v = new MySqlGeometry(0, 0);
            MySqlGeometry.TryParse(val.ToString(), out v);
            buffToWrite = v._valBinary;
              }

              byte[] result = new byte[GEOMETRY_LENGTH];

              for (int i = 0; i < buffToWrite.Length; i++)
              {
               if (buffToWrite.Length < GEOMETRY_LENGTH)
             result[i + 4] = buffToWrite[i];
               else
            result[i] = buffToWrite[i];
              }

            packet.WriteStringNoNull("_binary ");
            packet.WriteByte((byte)'\'');
            EscapeByteArray(result, GEOMETRY_LENGTH, packet);
            packet.WriteByte((byte)'\'');
        }
        public void CanUseReaderGetMySqlGeometry()
        {
            if (version.Major < 5) return;

              execSQL("DROP TABLE IF EXISTS Test");
              execSQL("CREATE TABLE Test (v Geometry NOT NULL)");

              MySqlGeometry v = new MySqlGeometry(47.37, -122.21);
              var par = new MySqlParameter("?v", MySqlDbType.Geometry);
              par.Value = v;

              MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", conn);
              cmd.Parameters.Add(par);
              cmd.ExecuteNonQuery();

              // reading as binary
              cmd.CommandText = "SELECT AsBinary(v) as v FROM Test";
              using (MySqlDataReader reader = cmd.ExecuteReader())
              {
            reader.Read();
            var val = reader.GetMySqlGeometry(0);
            var valWithName = reader.GetMySqlGeometry("v");
            Assert.AreEqual("POINT(47.37 -122.21)", val.ToString());
            Assert.AreEqual("POINT(47.37 -122.21)", valWithName.ToString());
              }

              // reading as geometry
              cmd.CommandText = "SELECT v as v FROM Test";
              using (MySqlDataReader reader = cmd.ExecuteReader())
              {
            reader.Read();
            var val = reader.GetMySqlGeometry(0);
            var valWithName = reader.GetMySqlGeometry("v");
            Assert.AreEqual("POINT(47.37 -122.21)", val.ToString());
            Assert.AreEqual("POINT(47.37 -122.21)", valWithName.ToString());
              }
        }
 public void CanGetToStringFromMySqlGeometry()
 {
     MySqlGeometry v = new MySqlGeometry(47.37, -122.21);
       var valToString = v.ToString();
       Assert.AreEqual("POINT(47.37 -122.21)", valToString);
 }
     public override object CreateProviderValue(DbGeometryWellKnownValue wellKnownValue)
     {
       if (wellKnownValue == null)
          throw new ArgumentNullException("wellKnownValue");

       if (wellKnownValue.WellKnownText != null)
       {
         var mysqlGeometry = new MySqlGeometry(true);
         MySqlGeometry.TryParse(wellKnownValue.WellKnownText.ToString(), out mysqlGeometry);
         return mysqlGeometry;          
       }
       else if (wellKnownValue.WellKnownBinary != null)
       {
         var mysqlGeometry = new MySqlGeometry(MySqlDbType.Geometry, wellKnownValue.WellKnownBinary);         
         return mysqlGeometry;                 
       }
       return null;
      }
        /// <summary>
        /// Get value from WKT format
        /// SRID=0;POINT (x y) or POINT (x y)
        /// </summary>
        /// <param name="value">WKT string format</param>    
        public static MySqlGeometry Parse(string value)
        {
            if (String.IsNullOrEmpty(value))
            throw new ArgumentNullException("value");

              if (!(value.Contains("SRID") || value.Contains("POINT(") || value.Contains("POINT (")))
            throw new FormatException("String does not contain a valid geometry value");

              MySqlGeometry result = new MySqlGeometry(0,0);
              MySqlGeometry.TryParse(value, out result);

              return result;
        }
    public override double? GetYCoordinate(DbGeometry geometryValue)
    {
      if (geometryValue == null)
        throw new ArgumentNullException("geometryValue");

      var providerValue = new MySqlGeometry();
      MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue);
      return providerValue.YCoordinate;
    }
    public override DbGeometry GeometryFromProviderValue(object providerValue)
    {
      if (providerValue == null)
        throw new ArgumentNullException("provider value");

      var myGeom = new MySqlGeometry();

      if (MySqlGeometry.TryParse(providerValue.ToString(), out myGeom))      
       return DbGeometry.FromText(providerValue.ToString());              
      else
        return null;      
    }
        IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal)
        {
            MySqlGeometry g;
              if (nullVal)
            g = new MySqlGeometry(_type, true);
              else
              {
            if (length == -1)
              length = (long)packet.ReadFieldLength();

            byte[] newBuff = new byte[length];
            packet.Read(newBuff, 0, (int)length);
            g = new MySqlGeometry(_type, newBuff);
              }
              return g;
        }
示例#25
0
        void CustomizingSqlCommands(BeanApi api, Bean bean)
        {
            /// ## Customizing SQL Commands
            /// In some cases it is necessary to manually adjust parameters of a SQL command which is about to execute.
            /// This can be done in the `QueryExecuting` event handler.
            ///
            /// **Example 1.**  Force `datetime2` type for all dates (SQL Server):
            #if CODE
            api.QueryExecuting += cmd => {
                foreach(SqlParameter p in cmd.Parameters)
                    if(p.Value is DateTime)
                        p.SqlDbType = SqlDbType.DateTime2;
            };
            #endif
            /// **Example 2.** Work with `MySqlGeometry` objects (MySQL/MariaDB):
            #if CODE
            api.QueryExecuting += cmd => {
                foreach(MySqlParameter p in cmd.Parameters)
                    if(p.Value is MySqlGeometry)
                        p.MySqlDbType = MySqlDbType.Geometry;
            };

            bean["point"] = new MySqlGeometry(34.962, 34.066);
            api.Store(bean);
            #endif
        }