Class: Handlersocket

Inherits:
Object
  • Object
show all
Defined in:
lib/handlersocket.rb,
lib/handlersocket/pure.rb,
lib/handlersocket/version.rb

Overview

Pure Ruby implementation of HS protocol

Sockets implementation is very slow in MRI, use HandlerSocket::Ext for better performance

Constant Summary collapse

VERSION =
"0.1.0"

Instance Method Summary collapse

Constructor Details

#initialize(host, port) ⇒ Handlersocket

Returns a new instance of Handlersocket.

Parameters:

  • host (String)
  • port (Fixnum)


12
13
14
15
# File 'lib/handlersocket.rb', line 12

def initialize(host, port)
  @host = host
  @port = port
end

Instance Method Details

#connectObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'ext/handlersocket_ext/handlersocket_ext.c', line 58

static VALUE rb_hs_connect(VALUE hs) {
  SOCKET_DATA *data;
  struct sockaddr_in server;

  Data_Get_Struct(hs, SOCKET_DATA, data);

  if (data->socket_desc == -1) {
    hs_free(data);
  }

  data->socket_desc = socket(AF_INET , SOCK_STREAM , 0);
  if (data->socket_desc == -1) {
      rb_warn("Could not create socket");
  }

  server.sin_addr.s_addr = inet_addr(data->host);
  server.sin_family = AF_INET;
  server.sin_port = htons(data->port);

  if (connect(data->socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) {
    rb_raise(rb_eStandardError, "HS: connect error");
  }

  return Qnil;
}

#disconnectObject



44
45
46
47
48
49
50
# File 'ext/handlersocket_ext/handlersocket_ext.c', line 44

static VALUE rb_hs_disconnect(VALUE hs) {
  SOCKET_DATA *data;
  Data_Get_Struct(hs, SOCKET_DATA, data);
  hs_free(data);

  return Qnil;
}

#find(idx_id, op, args, extra = []) ⇒ Array<String>

Runs a find statement on HandlerSocket server and returns matched rows

Parameters:

  • idx_id (String)

    id of index

  • op (String)

    operation (‘=’, ‘>’, ‘<’)

  • args (Array<String>)

    arguments for comparison

  • extra (Array<String>) (defaults to: [])

    arguments like limit and offset

Returns:

  • (Array<String>)

    matched rows



51
52
53
54
# File 'lib/handlersocket.rb', line 51

def find(idx_id, op, args, extra = [])
  req = [idx_id, op, args.length.to_s, *args, *extra]
  query(req)
end

#open_index(idx_id, db_name, tbl_name, idx_name, columns) ⇒ Array<String>

Opens an an index for requests

Parameters:

  • idx_id (String)

    id of index

  • db_name (String)

    name of the database

  • tbl_name (String)

    name of the table

  • idx_name (String)

    name of the index

  • columns (Array<String>)

    you want to get

Returns:

  • (Array<String>)


37
38
39
40
# File 'lib/handlersocket.rb', line 37

def open_index(idx_id, db_name, tbl_name, idx_name, columns)
  req = ["P", idx_id, db_name, tbl_name, idx_name, columns.join(",")]
  query(req)
end

#query(req) ⇒ Array<String>

Sends request to a HS server and returns a reply

Parameters:

  • req (Array<String>)

Returns:

  • (Array<String>)


23
24
25
# File 'lib/handlersocket.rb', line 23

def query(*args)
  # A stub method
end

#reconnectObject



90
91
92
93
94
95
# File 'ext/handlersocket_ext/handlersocket_ext.c', line 90

static VALUE rb_hs_reconnect(VALUE hs) {
  rb_hs_disconnect(hs);
  rb_hs_connect(hs);

  return Qnil;
}

#socketTCPSocket

Returns a memoized instance of TCP socket

Returns:

  • (TCPSocket)


13
14
15
# File 'lib/handlersocket/pure.rb', line 13

def socket
  @socket ||= TCPSocket.new(@host, @port)
end