Skip to content

Commit

Permalink
Added SQL Server support
Browse files Browse the repository at this point in the history
  • Loading branch information
brennandunn committed Sep 29, 2009
1 parent 7fdce14 commit 20bb694
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 3 deletions.
4 changes: 3 additions & 1 deletion lib/geokit-rails/acts_as_mappable.rb
Expand Up @@ -135,7 +135,9 @@ module SingletonMethods #:nodoc:
def adapter
@adapter ||= begin
require File.join(File.dirname(__FILE__), 'adapters', connection.adapter_name.downcase)
Adapters.const_get(connection.adapter_name.camelcase).new(self)
klass = Adapters.const_get(connection.adapter_name.camelcase)
klass.load(self) unless klass.loaded
klass.new(self)
rescue LoadError
raise UnsupportedAdapter, "`#{connection.adapter_name.downcase}` is not a supported adapter."
end
Expand Down
2 changes: 2 additions & 0 deletions lib/geokit-rails/adapters/abstract.rb
Expand Up @@ -3,6 +3,8 @@ module Adapters
class Abstract
class NotImplementedError < StandardError ; end

cattr_accessor :loaded

def initialize(klass)
@owner = klass
end
Expand Down
43 changes: 43 additions & 0 deletions lib/geokit-rails/adapters/sqlserver.rb
@@ -0,0 +1,43 @@
module Geokit
module Adapters
class SQLServer < Abstract

class << self

def load(klass)
klass.connection.execute <<-EOS
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[geokit_least]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[geokit_least]
EOS

klass.connection.execute <<-EOS
CREATE FUNCTION [dbo].geokit_least (@value1 float,@value2 float) RETURNS float AS BEGIN
return (SELECT CASE WHEN @value1 < @value2 THEN @value1 ELSE @value2 END) END
EOS
self.loaded = true
end

end

def initialize(*args)
super(*args)
end

def sphere_distance_sql(lat, lng, multiplier)
%|
(ACOS([dbo].geokit_least(1,COS(#{lat})*COS(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*COS(RADIANS(#{qualified_lng_column_name}))+
COS(#{lat})*SIN(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*SIN(RADIANS(#{qualified_lng_column_name}))+
SIN(#{lat})*SIN(RADIANS(#{qualified_lat_column_name}))))*#{multiplier})
|
end

def flat_distance_sql(origin, lat_degree_units, lng_degree_units)
%|
SQRT(POWER(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+
POWER(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2))
|
end

end
end
end
10 changes: 8 additions & 2 deletions test/database.yml
Expand Up @@ -2,7 +2,7 @@ baes: &base
host: localhost
username: root
password:

mysql:
adapter: mysql
database: geokit_plugin_test
Expand All @@ -11,4 +11,10 @@ mysql:
postgresql:
adapter: postgresql
database: geokit_plugin_test
<<: *base
<<: *base

sqlserver:
adapter: sqlserver
mode: ODBC
dsn: geokit_tests
username: ruby

0 comments on commit 20bb694

Please sign in to comment.