Creating database
===================
-OSM server uses a database with the following name:
+OSM server uses a Postgres database with the following name:
openstreetmap
You may create it with your preferable client or run next (linux) command:
-$ mysql -u <uid> -p
-
-(change <uid> with appropriate username of administrative user eg. root )
-
-> create database openstreetmap default character set utf8;
-> exit
-
-Creating user, password, and access rights
-============================================
-
-$ mysql -u <uid> -p
-
-(change <uid> with appropriate username of administrative user eg. root )
-
-> grant all privileges on openstreetmap.* to 'openstreetmap'@'localhost' identified by 'openstreetmap';
-> flush privileges;
-> exit
-
-Creating functions For MySQL
-==============================
-
-Run this command in the db/functions directory:
-
-$ make libmyosm.so
-
-You might also need to install:
-- mysql client development libraries: $ sudo apt-get install libmysqlclient16-dev
-- ruby development libraries: $ sudo apt-get install ruby1.8-dev
-for build to succeed.
-
-Make sure the db/functions directory is on the MySQL server's library
-path and restart the MySQL server.
-
-On Linux the easiest way to do this is to create /etc/ld.so.conf.d/osm.conf, and place the path to the db/functions directory in it and then run the ldconfig command as root.
-
-On OS X: sudo ln -s /path_to_your_osm_install/sites/rails_port/db/functions/libmyosm.so /usr/local/lib/libmyosm.so
-
-Now create the functions as follows:
-
-$ mysql -u <uid> -p openstreetmap
-
-(change <uid> with appropriate username of administrative user eg. root )
-
-> create function tile_for_point returns integer soname 'libmyosm.so';
-> create function maptile_for_point returns integer soname 'libmyosm.so';
-> exit
+$ createdb openstreetmap
Creating functions for PgSQL
==============================
You will need to make sure the database connection is configured in database.yml in config directory
You might start with example configuration provided:
-$ cp config/mysql.example.database.yml config/database.yml
+$ cp config/example.database.yml config/database.yml
-#ifndef USE_MYSQL
-#ifndef USE_PGSQL
-#error One of USE_MYSQL or USE_PGSQL must be defined
-#endif
-#endif
-
#include <math.h>
+#include <postgres.h>
+#include <fmgr.h>
-/* The real maptile-for-point functionality is here */
-
-static long long internal_maptile_for_point(double lat, double lon, long long zoom)
+Datum
+maptile_for_point(PG_FUNCTION_ARGS)
{
- double scale = pow(2, zoom);
- double r_per_d = M_PI / 180;
+ double lat = PG_GETARG_INT64(0) / 10000000.0;
+ double lon = PG_GETARG_INT64(1) / 10000000.0;
+ int zoom = PG_GETARG_INT32(2);
+ double scale = pow(2, zoom);
+ double r_per_d = M_PI / 180;
unsigned int x;
unsigned int y;
x = floor((lon + 180.0) * scale / 360.0);
y = floor((1 - log(tan(lat * r_per_d) + 1.0 / cos(lat * r_per_d)) / M_PI) * scale / 2.0);
- return (x << zoom) | y;
-}
-
-#ifdef USE_MYSQL
-#ifdef USE_PGSQL
-#error ONLY one of USE_MYSQL and USE_PGSQL should be defined
-#endif
-
-#include <my_global.h>
-#include <my_sys.h>
-#include <m_string.h>
-#include <mysql.h>
-
-my_bool maptile_for_point_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
-{
- if ( args->arg_count != 3 ||
- args->arg_type[0] != INT_RESULT ||
- args->arg_type[1] != INT_RESULT ||
- args->arg_type[2] != INT_RESULT )
- {
- strcpy( message, "Your maptile_for_point arguments are bogus!" );
- return 1;
- }
-
- return 0;
-}
-
-void maptile_for_point_deinit(UDF_INIT *initid)
-{
- return;
-}
-
-long long maptile_for_point(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
-{
- double lat = *(long long *)args->args[0] / 10000000.0;
- double lon = *(long long *)args->args[1] / 10000000.0;
- long long zoom = *(long long *)args->args[2];
-
- return internal_maptile_for_point(lat, lon, zoom);
-}
-#endif
-
-#ifdef USE_PGSQL
-#ifdef USE_MYSQL
-#error ONLY one of USE_MYSQL and USE_PGSQL should be defined
-#endif
-
-#include <postgres.h>
-#include <fmgr.h>
-
-Datum
-maptile_for_point(PG_FUNCTION_ARGS)
-{
- double lat = PG_GETARG_INT64(0) / 10000000.0;
- double lon = PG_GETARG_INT64(1) / 10000000.0;
- int zoom = PG_GETARG_INT32(2);
-
- PG_RETURN_INT32(internal_maptile_for_point(lat, lon, zoom));
+ PG_RETURN_INT32((x << zoom) | y);
}
PG_FUNCTION_INFO_V1(maptile_for_point);
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
-
-#endif
end
end
- if defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter)
- class MysqlAdapter
- alias_method :old_native_database_types, :native_database_types
-
- def native_database_types
- types = old_native_database_types
- types[:bigint] = { :name => "bigint", :limit => 20 }
- types[:double] = { :name => "double" }
- types[:integer_pk] = { :name => "integer DEFAULT NULL auto_increment PRIMARY KEY" }
- types[:bigint_pk] = { :name => "bigint(20) DEFAULT NULL auto_increment PRIMARY KEY" }
- types[:bigint_pk_64] = { :name => "bigint(64) DEFAULT NULL auto_increment PRIMARY KEY" }
- types[:bigint_auto_64] = { :name => "bigint(64) DEFAULT NULL auto_increment" }
- types[:bigint_auto_11] = { :name => "bigint(11) DEFAULT NULL auto_increment" }
- types[:bigint_auto_20] = { :name => "bigint(20) DEFAULT NULL auto_increment" }
- types[:four_byte_unsigned] = { :name=> "integer unsigned" }
- types[:inet] = { :name=> "integer unsigned" }
-
- enumerations.each do |e,v|
- types[e.to_sym]= { :name => "enum('#{v.join '\',\''}')" }
- end
-
- types
- end
-
- def change_column(table_name, column_name, type, options = {})
- unless options_include_default?(options)
- options[:default] = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Default"]
-
- unless type == :string or type == :text
- options.delete(:default) if options[:default] = "";
- end
- end
-
- change_column_sql = "ALTER TABLE #{table_name} CHANGE #{column_name} #{column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
- add_column_options!(change_column_sql, options)
- execute(change_column_sql)
- end
-
- def myisam_table
- return { :id => false, :force => true, :options => "ENGINE=MyIsam" }
- end
-
- def innodb_table
- return { :id => false, :force => true, :options => "ENGINE=InnoDB" }
- end
-
- def innodb_option
- return "ENGINE=InnoDB"
- end
-
- def change_engine (table_name, engine)
- execute "ALTER TABLE #{table_name} ENGINE = #{engine}"
- end
-
- def add_fulltext_index (table_name, column)
- execute "CREATE FULLTEXT INDEX `#{table_name}_#{column}_idx` ON `#{table_name}` (`#{column}`)"
- end
-
- def enumerations
- @enumerations ||= Hash.new
- end
-
- def create_enumeration (enumeration_name, values)
- enumerations[enumeration_name] = values
- end
-
- def drop_enumeration (enumeration_name)
- enumerations.delete(enumeration_name)
- end
+ class PostgreSQLAdapter
+ alias_method :old_native_database_types, :native_database_types
+
+ def native_database_types
+ types = old_native_database_types
+ types[:double] = { :name => "double precision" }
+ types[:integer_pk] = { :name => "serial PRIMARY KEY" }
+ types[:bigint_pk] = { :name => "bigserial PRIMARY KEY" }
+ types[:bigint_pk_64] = { :name => "bigserial PRIMARY KEY" }
+ types[:bigint_auto_64] = { :name => "bigint" } #fixme: need autoincrement?
+ types[:bigint_auto_11] = { :name => "bigint" } #fixme: need autoincrement?
+ types[:bigint_auto_20] = { :name => "bigint" } #fixme: need autoincrement?
+ types[:four_byte_unsigned] = { :name => "bigint" } # meh
+ types[:inet] = { :name=> "inet" }
+
+ enumerations.each_key do |e|
+ types[e.to_sym]= { :name => e }
+ end
+
+ types
+ end
- def alter_primary_key(table_name, new_columns)
- execute("alter table #{table_name} drop primary key, add primary key (#{new_columns.join(',')})")
- end
+ def myisam_table
+ return { :id => false, :force => true, :options => ""}
+ end
- def interval_constant(interval)
- "'#{interval}'"
- end
+ def innodb_table
+ return { :id => false, :force => true, :options => ""}
end
- end
- if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
- class PostgreSQLAdapter
- alias_method :old_native_database_types, :native_database_types
-
- def native_database_types
- types = old_native_database_types
- types[:double] = { :name => "double precision" }
- types[:integer_pk] = { :name => "serial PRIMARY KEY" }
- types[:bigint_pk] = { :name => "bigserial PRIMARY KEY" }
- types[:bigint_pk_64] = { :name => "bigserial PRIMARY KEY" }
- types[:bigint_auto_64] = { :name => "bigint" } #fixme: need autoincrement?
- types[:bigint_auto_11] = { :name => "bigint" } #fixme: need autoincrement?
- types[:bigint_auto_20] = { :name => "bigint" } #fixme: need autoincrement?
- types[:four_byte_unsigned] = { :name => "bigint" } # meh
- types[:inet] = { :name=> "inet" }
-
- enumerations.each_key do |e|
- types[e.to_sym]= { :name => e }
- end
-
- types
- end
+ def innodb_option
+ return ""
+ end
- def myisam_table
- return { :id => false, :force => true, :options => ""}
- end
+ def change_engine (table_name, engine)
+ end
- def innodb_table
- return { :id => false, :force => true, :options => ""}
- end
+ def add_fulltext_index (table_name, column)
+ execute "CREATE INDEX #{table_name}_#{column}_idx on #{table_name} (#{column})"
+ end
- def innodb_option
- return ""
- end
+ def enumerations
+ @enumerations ||= Hash.new
+ end
- def change_engine (table_name, engine)
- end
+ def create_enumeration (enumeration_name, values)
+ enumerations[enumeration_name] = values
+ execute "create type #{enumeration_name} as enum ('#{values.join '\',\''}')"
+ end
- def add_fulltext_index (table_name, column)
- execute "CREATE INDEX #{table_name}_#{column}_idx on #{table_name} (#{column})"
- end
+ def drop_enumeration (enumeration_name)
+ execute "drop type #{enumeration_name}"
+ enumerations.delete(enumeration_name)
+ end
- def enumerations
- @enumerations ||= Hash.new
- end
+ def alter_primary_key(table_name, new_columns)
+ execute "alter table #{table_name} drop constraint #{table_name}_pkey; alter table #{table_name} add primary key (#{new_columns.join(',')})"
+ end
- def create_enumeration (enumeration_name, values)
- enumerations[enumeration_name] = values
- execute "create type #{enumeration_name} as enum ('#{values.join '\',\''}')"
- end
+ def interval_constant(interval)
+ "'#{interval}'::interval"
+ end
- def drop_enumeration (enumeration_name)
- execute "drop type #{enumeration_name}"
- enumerations.delete(enumeration_name)
- end
+ def add_index(table_name, column_name, options = {})
+ column_names = Array(column_name)
+ index_name = index_name(table_name, :column => column_names)
- def alter_primary_key(table_name, new_columns)
- execute "alter table #{table_name} drop constraint #{table_name}_pkey; alter table #{table_name} add primary key (#{new_columns.join(',')})"
+ if Hash === options # legacy support, since this param was a string
+ index_type = options[:unique] ? "UNIQUE" : ""
+ index_name = options[:name] || index_name
+ index_method = options[:method] || "BTREE"
+ else
+ index_type = options
end
- def interval_constant(interval)
- "'#{interval}'::interval"
+ quoted_column_names = column_names.map { |e| quote_column_name(e) }
+ if Hash === options and options[:lowercase]
+ quoted_column_names = quoted_column_names.map { |e| "LOWER(#{e})" }
end
+ quoted_column_names = quoted_column_names.join(", ")
- def add_index(table_name, column_name, options = {})
- column_names = Array(column_name)
- index_name = index_name(table_name, :column => column_names)
-
- if Hash === options # legacy support, since this param was a string
- index_type = options[:unique] ? "UNIQUE" : ""
- index_name = options[:name] || index_name
- index_method = options[:method] || "BTREE"
- else
- index_type = options
- end
-
- quoted_column_names = column_names.map { |e| quote_column_name(e) }
- if Hash === options and options[:lowercase]
- quoted_column_names = quoted_column_names.map { |e| "LOWER(#{e})" }
- end
- quoted_column_names = quoted_column_names.join(", ")
-
- execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} USING #{index_method} (#{quoted_column_names})"
- end
+ execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} USING #{index_method} (#{quoted_column_names})"
end
end
end