class DB::MySQL::Native::Connection

Public Class Methods

connect(connection_string = "", io: ::IO) click to toggle source
# File lib/db/mysql/native/connection.rb, line 57
def self.connect(connection_string = "", io: ::IO)
        pointer = Native.mysql_init(nil)
        Native.mysql_options(pointer, MYSQL_OPT_NONBLOCK, nil)
        
        uri = URI(connection_string)
        host = uri.host
        user = uri.user
        password = uri.password
        database = uri.path.gsub(/^\//, '')
        port = uri.port || 0
        unix_socket = nil
        client_flags = CLIENT_MULTI_STATEMENT | CLIENT_MULTI_RESULTS
        
        result = FFI::MemoryPointer.new(:pointer)
        
        status = Native.mysql_real_connect_start(result, pointer, host, user, password, database, port, unix_socket, client_flags);
        
        if status > 0
                io = io.new(Native.mysql_get_socket(pointer), "r+")
                
                while status > 0
                        if status & MYSQL_WAIT_READ
                                io.wait_readable
                        elsif status & MYSQL_WAIT_WRITE
                                io.wait_writable
                        else
                                io.wait_any
                        end
                        
                        status = Native.mysql_real_connect_cont(result, pointer, status)
                end
        end
        
        if result.read_pointer.null?
                raise "Could not connect: #{Native.mysql_error(pointer)}!"
        end
        
        return self.new(pointer, io)
end
new(address, io) click to toggle source
Calls superclass method
# File lib/db/mysql/native/connection.rb, line 97
def initialize(address, io)
        super(address)
        
        @io = io
        @result = nil
end

Public Instance Methods

check_error!(message) click to toggle source
# File lib/db/mysql/native/connection.rb, line 112
def check_error!(message)
        if Native.mysql_errno(self) != 0
                raise "#{message}: #{Native.mysql_error(self)}!"
        end
end
close() click to toggle source
# File lib/db/mysql/native/connection.rb, line 130
def close
        self.free_result
        
        Native.mysql_close(self)
        
        @io.close
end
free_result() click to toggle source
# File lib/db/mysql/native/connection.rb, line 122
def free_result
        if @result
                Native.mysql_free_result(@result)
                
                @result = nil
        end
end
next_result() click to toggle source
# File lib/db/mysql/native/connection.rb, line 156
def next_result
        if @result
                self.free_result
                
                # Successful and there are no more results:
                return if Native.mysql_next_result(self) == -1
                
                check_error!("Next result")
        end
        
        @result = Native.mysql_use_result(self)
        
        if @result.null?
                check_error!("Next result")
                
                return nil
        else
                return Result.new(self, @result)
        end
end
send_query(statement) click to toggle source
# File lib/db/mysql/native/connection.rb, line 138
def send_query(statement)
        self.free_result
        
        error = FFI::MemoryPointer.new(:int)
        
        status = Native.mysql_real_query_start(error, self, statement, statement.bytesize)
        
        while status != 0
                self.wait_for(status)
                
                status = Native.mysql_real_query_cont(error, self, status)
        end
        
        if error.read_int != 0
                raise "Could not send query: #{Native.mysql_error(self)}!"
        end
end
status() click to toggle source
# File lib/db/mysql/native/connection.rb, line 118
def status
        Native.mysql_stat(self)
end
wait_for(status) click to toggle source
# File lib/db/mysql/native/connection.rb, line 104
def wait_for(status)
        if status & MYSQL_WAIT_READ
                @io.wait_readable
        elsif status & MYSQL_WAIT_WRITE
                @io.wait_writable
        end
end