IV. Support Mysql Spatial Extensions via erlydb_mysql
ErlyDB supports most database operations, and it can also be extended to support more complex operations. Here is an example, where I need to support Mysql spatial extensions.
Assume we have a table: places, which has a mysql point field: location, here is the code:
-module(places).
-export([get_location_as_tuple/1,
set_location_by_tuple/2
]).
%% @spec Id::integer() -> {float(), float()}
get_location_as_tuple(Id) ->
ESQL = {esql, {select, 'AsText(location)', {from, ?MODULE}, {where, {'id', '=', Id}}}},
case erlydb_mysql:q(ESQL) of
%% Example:
%% {data, {mysql_result, [{<<>>, <<"AsText(location)">>, 8192, 'VAR_STRING'}],
%% [[<<"POINT(-122.292 37.8341)">>]],
%% 0,
%% []}}
{data, {mysql_result, [{_, <<"AsText(location)">>, _, _}],
[[FirstResult]|_Rest],
_,
_}} ->
case io_lib:fread("POINT(~f ~f)", binary_to_list(FirstResult)) of
{ok, [X, Y], _} -> {X, Y};
_Else -> undefined
end;
_Error ->
undefined
end.
%% @spec Id::integer, {X::float(), Y::float()} -> ok | error
set_location_by_tuple(Id, {X, Y}) ->
%% "UPDATE places SET location = PointFromText(\'POINT(1 1)\') WHERE (id = 1)"
PointFromText = point_tuple_to_point_from_text({X, Y}),
ESQL = {esql, {update, ?MODULE, [{location, PointFromText}], {'id', '=', Id}}},
Options = [{allow_unsafe_statements, true}],
case erlydb_mysql:q(ESQL, Options) of
{updated, {mysql_result, [], [], _UpdatedNum, []}} -> ok;
_Error -> error
end.
point_tuple_to_point_from_text({X, Y}) ->
%% as mysql support float in format of someting like 1.20002300000000005298e+02,
%% we can just apply float_to_list/1 to X and Y
PointFromText = lists:flatten(io_lib:fwrite("PointFromText('POINT(~f ~f)')", [X, Y])),
list_to_atom(PointFromText). %% 'PointFromText(\'POINT(X Y)\')'
Now we can:
> places:set_location_by_tuple(6, {-11.11, 88.88}).
> places:get_location_as_tuple(6).
{-11.11, 88.88}
分享到:
相关推荐
rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机 用于 Ruby on Rails 核心开发的虚拟机简介注意:这个虚拟机不是为 Rails 应用程序开发而设计的,只是为。 这个项目自动设置开发环境,以便在 Ruby on Rails ...
rails-angular-postgres-and-bootstrap-second-edition 英文原版
rails-exporter-源码.rar
rails-documentation-2-0-2
rails-beginner-s-guide是Rails 指导手册,帮组学习了解rails开发
用于Ruby on Rails核心开发的虚拟机 介绍 请注意,该虚拟机并非为...host $ cd rails-dev-box host $ vagrant up 而已。 安装完成后,您可以使用以下命令访问虚拟机: host $ vagrant ssh Welcome to Ubuntu 20.10
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
awesome-rails-gem-zh_CN, Rails 常用 Gem 列表 - Awesome Rails Gem 中文版
rails-react-components-源码.rar
rails-builds-test-源码.rar
rails-yelp-mvp-源码.rar
rails-development-environment-master.rar
rails-documentation-1-2-1.zip
Ruby on Rails 初体验--北大青鸟教师专题讲座PPT 想学Ruby的赶快下载看看。 Ruby--目前最快速开发工具
rails-documentation-1-2-0-rc1.chm
Ruby on Rails Guides v2 - Ruby on Rails 4.2.5
rails-ftw-v0.18-2.1.5-4.1.8.exe用于在windows环境下搭建readmine环境
rails-tutorial-源码.rar
rails-playlists-源码.rar
Ruby on Rails入门经典-例子,有很多rails工程实例。