lib/mysqlex_pool.ex

defmodule MysqlexPool do
	@moduledoc """
	A Simple wrapper around mxsqlex to add pooling
	"""
	use Application

	@spec start( atom, :permanent | :transient | :temporary ) :: :ok | { :error, term }
	def start( _type, _args ) do
		start_link( nil )
	end
	
	@spec start_link( { } ) :: { :ok, pid } | :ignore | { :error, { :already_started, pid } | { :shutdown, term } | term }
	def start_link( _opts ) do
		import Supervisor.Spec, warn: false

		# Define workers and child supervisors to be supervised
		children = [
			supervisor( MysqlexPool.Pool, [ ] ),
		]

		# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
		# for other strategies and supported options
		opts = [ strategy: :one_for_one, name: MysqlexPool.Supervisor ]
		Supervisor.start_link( children, opts )
	end

	@doc """
	execute a mysql query

	## Examples

		iex>MysqlexPool.query( "SELECT ID, Name FROM `city` WHERE id = ?", [ 1 ] )
		{ :ok, %Mysqlex.Result{columns: ["ID", "Name"], command: :select, last_insert_id: nil, num_rows: 1, rows: [{1, "Kabul"}] } }
		iex>MysqlexPool.query( "SELECT ID, city.Name as City, Population FROM city WHERE city.CountryCode IN ( SELECT country.Code FROM country WHERE Population < ? ) ORDER BY Population desc LIMIT 0,?", [ 50_000, 2 ] )
		{ :ok, %Mysqlex.Result{columns: ["ID", "City", "Population"], command: :select, last_insert_id: nil, num_rows: 2, rows: [{915, "Gibraltar", 27025}, {553, "George Town", 19600}] } }
	"""
	@spec query( String.t, List.t ) :: { :ok, Mysqlex.Result.t } |  { :error, any }
	def query( statement, params ) do
		MysqlexPool.Pool.query( statement, params )
	end

	@doc """
	execute a mysql query

	## Examples

		iex>MysqlexPool.query( "SELECT ID, Name FROM `city` WHERE id = 1" )
		{ :ok, %Mysqlex.Result{columns: ["ID", "Name"], command: :select, last_insert_id: nil, num_rows: 1, rows: [{1, "Kabul"}] } }
	"""
	@spec query( String.t ) :: { :ok, Mysqlex.Result.t } |  { :error, any }
	def query( statement ) do
		MysqlexPool.Pool.query( statement, [ ] )
	end
end