private void Create(Node node) { OracleCommand command; command = this.CreateCommand("insert into node (id,latitude,longitude,changeset_id,visible,timestamp,tile,version,usr,usr_id) values (:id,:latitude,:longitude,:changeset_id,:visible,:timestamp,:tile,:version,:usr,:usr_id)"); // format data and create parameters. long?id = node.Id; command.Parameters.Add(new OracleParameter("id", id.ConvertToDBValue <long>())); int?latitude = (int)(node.Latitude * 10000000); // latitude should always contain a value. command.Parameters.Add(new OracleParameter("latitude", latitude.ConvertToDBValue <int>())); int?longitude = (int)(node.Longitude * 10000000); // longitude should always containt a value. command.Parameters.Add(new OracleParameter("longitude", longitude.ConvertToDBValue <int>())); long?changeset_id = node.ChangeSetId; command.Parameters.Add(new OracleParameter("changeset_id", changeset_id.ConvertToDBValue <long>())); bool?visible = node.Visible; int visible_int = 1; if (!visible.HasValue) { visible_int = 1; } command.Parameters.Add(new OracleParameter("visible", visible_int)); DateTime?timestamp = node.TimeStamp; command.Parameters.Add(new OracleParameter("ts", timestamp.ConvertToDBValue <DateTime>())); // calculate the tile the node belongs to. long tile = TileCalculations.xy2tile(TileCalculations.lon2x(node.Longitude.Value), TileCalculations.lat2y(node.Latitude.Value)); command.Parameters.Add(new OracleParameter("tile", tile)); long?version = (long)node.Version; command.Parameters.Add(new OracleParameter("version", version.ConvertToDBValue <long>())); command.Parameters.Add("usr", node.UserName); command.Parameters.Add("usr_id", node.UserId); command.ExecuteNonQuery(); command.Dispose(); // insert tags. this.CreateTags(node.Id.Value, node.Tags, "node_tags", "node_id"); }
/// <summary> /// Adds a node to this target. /// </summary> /// <param name="node"></param> public override void AddNode(Node node) { if (!node.Latitude.HasValue || !node.Longitude.HasValue) { // cannot insert nodes without lat/lon. throw new ArgumentOutOfRangeException("node", "Cannot insert nodes without lat/lon."); } // insert the node. _insertNodeCmd.Parameters[0].Value = node.Id; _insertNodeCmd.Parameters[1].Value = (node.Latitude.HasValue ? (int)(node.Latitude.GetValueOrDefault() * 10000000.0) : (int?)null) .ConvertToDBValue(); _insertNodeCmd.Parameters[2].Value = (node.Longitude.HasValue ? (int)(node.Longitude.GetValueOrDefault() * 10000000.0) : (int?)null) .ConvertToDBValue(); _insertNodeCmd.Parameters[3].Value = node.ChangeSetId.ConvertToDBValue(); _insertNodeCmd.Parameters[4].Value = node.Visible.ConvertToDBValue(); _insertNodeCmd.Parameters[5].Value = this.ConvertDateTime(node.TimeStamp); _insertNodeCmd.Parameters[6].Value = TileCalculations.xy2tile((uint)TileCalculations.lon2x(node.Longitude.Value), (uint)TileCalculations.lat2y(node.Latitude.Value)); _insertNodeCmd.Parameters[7].Value = node.Version.ConvertToDBValue(); _insertNodeCmd.Parameters[8].Value = node.UserName; _insertNodeCmd.Parameters[9].Value = node.UserId.ConvertToDBValue(); _insertNodeCmd.ExecuteNonQuery(); // insert the tags. if (node.Tags != null) { foreach (Tag keyValuePair in node.Tags) { _insertNodeTagsCmd.Parameters[0].Value = node.Id; _insertNodeTagsCmd.Parameters[1].Value = keyValuePair.Key; _insertNodeTagsCmd.Parameters[2].Value = keyValuePair.Value; _insertNodeTagsCmd.ExecuteNonQuery(); } } //// commit nodes in batch. //_nodecount++; //if (_nodecount < BatchNodes) // return; //_insertNodeCmd.Transaction.Commit(); //_insertNodeTagsCmd.Transaction = // _insertNodeCmd.Transaction = _connection.BeginTransaction(); }
/// <summary> /// Modifies the given node. /// </summary> /// <param name="node"></param> private void Modify(Node node) { OracleCommand command; string sql = string.Empty; DateTime?timestamp = node.TimeStamp; if (timestamp.HasValue) { sql = "update node set latitude = :latitude, longitude = :longitude, changeset_id = :changeset_id, visible=:visible, timestamp=to_date('{0}','YYYY/MM/DD HH24:MI'), tile=:tile, version=:version, usr=:usr, usr_id=:usr_id where id=:id"; sql = string.Format(sql, timestamp.Value.ToString("yyyy/MM/dd HH:mm")); } else { sql = "update node set latitude = :latitude, longitude = :longitude, changeset_id = :changeset_id, visible=:visible, timestamp=null, tile=:tile, version=:version where id=:id"; } command = this.CreateCommand(sql); // format data and create parameters. int?latitude = (int)(node.Latitude * 10000000); // latitude should always contain a value. command.Parameters.Add("latitude", latitude.ConvertToDBValue <int>()); int?longitude = (int)(node.Longitude * 10000000); // longitude should always containt a value. command.Parameters.Add("longitude", longitude.ConvertToDBValue <int>()); long?changeset_id = node.ChangeSetId; command.Parameters.Add("changeset_id", changeset_id.ConvertToDBValue <long>()); bool?visible = node.Visible; int visible_int = 1; if (!visible.HasValue || !visible.Value) { visible_int = 0; } command.Parameters.Add("visible", visible_int); // calculate the tile the node belongs to. long tile = TileCalculations.xy2tile(TileCalculations.lon2x(node.Longitude.Value), TileCalculations.lat2y(node.Latitude.Value)); command.Parameters.Add("tile", tile); long?version = (long)node.Version; command.Parameters.Add("version", version.ConvertToDBValue <long>()); command.Parameters.Add("usr", node.UserName); command.Parameters.Add("usr_id", node.UserId); long?id = node.Id; command.Parameters.Add("id", id.ConvertToDBValue <long>()); // execute the update command. command.ExecuteNonQuery(); command.Dispose(); if (this.Exists("node", id.Value)) { // modify the node tags. this.ModifyTags(node.Id.Value, node.Tags, "node_tags", "node_id"); } // raise the modified event. this.RaiseChange(ChangeType.Modify, OsmGeoType.Node, node.Id.Value); }