View | Details | Raw Unified | Return to bug 170348 | Differences between
and this patch

Collapse All | Expand All

(-)tarantool/Makefile (-26 / +38 lines)
Lines 1-43 Link Here
1
# New ports collection makefile for:	tarantool
1
# Created by: Gvozdikov Veniamin <g.veniamin@googlemail.com>
2
# Date created:		2011-11-25
2
# $FreeBSD: ports/databases/tarantool/Makefile,v 1.1 2012/01/02 15:41:27 eadler Exp $
3
# Whom:			Gvozdikov Veniamin <g.veniamin@googlemail.com>
4
#
5
# $FreeBSD: ports/databases/tarantool/Makefile,v 1.2 2012/11/17 05:55:25 svnexp Exp $
6
#
7
3
8
PORTNAME=	tarantool
4
PORTNAME=	tarantool
9
PORTVERSION=	1.3.5
5
PORTVERSION=	1.4.8
10
CATEGORIES=	databases
6
CATEGORIES=	databases
11
MASTER_SITES=	http://launchpadlibrarian.net/71705094/
7
MASTER_SITES=	http://tarantool.org/dist/
12
DISTNAME=	${PORTNAME}-${PORTVERSION}-src
8
DISTNAME=	${PORTNAME}-${PORTVERSION}-${TR_REV}-src
13
9
14
MAINTAINER=	g.veniamin@googlemail.com
10
MAINTAINER=	g.veniamin@googlemail.com
15
COMMENT=	Tarantool, is a high performance key/value storage server
11
COMMENT=	Tarantool, is a high performance key/value storage server
16
12
17
LICENSE=	BSD
13
LICENSE=	BSD
18
14
19
ONLY_FOR_ARCHS=	i386
15
TR_REV=		20-gdfe40fc
20
21
USE_CMAKE=	yes
16
USE_CMAKE=	yes
22
ARCH=		i386
17
USE_GCC=	4.6+
18
USE_GETTEXT=	build
19
USE_GMAKE=	yes
20
USE_LDCONFIG=	yes
21
USE_PERL5=	yes
23
USE_RC_SUBR=	${PORTNAME}
22
USE_RC_SUBR=	${PORTNAME}
24
SUB_FILES=	pkg-message
23
SUB_FILES=	pkg-message
24
MAN1=		tarantool_box.1
25
25
26
.include <bsd.port.pre.mk>
26
OPTIONS_DEFINE=	CLIENT DEBUG STATIC
27
27
CLIENT_DESC=	Enable client
28
post-patch:
28
DEBUG_DESC=	Enable debug
29
	@${REINPLACE_CMD} -e 's|%%DOCSDIR%%|${DOCSDIR}|g' \
29
STATIC_DESC=	Enable static (got core dump)
30
		${WRKSRC}/CMakeLists.txt
30
31
	@${REINPLACE_CMD} -e 's|%%ETCDIR%%|${ETCDIR}|g' \
31
OPTIONS_DEFAULT=CLIENT DEBUG
32
		${WRKSRC}/test/CMakeLists.txt
32
33
	@${RM} ${WRKSRC}/test/lib/server.py \
33
.include <bsd.port.options.mk>
34
		${WRKSRC}/test/lib/silverbox.py \
34
35
		${WRKSRC}/test/lib/tarantool_admin.py \
35
.if ${PORT_OPTIONS:MCLIENT}
36
		${WRKSRC}/test/lib/tarantool_feeder_server.py \
36
CMAKE_ARGS+=	-DENABLE_CLIENT=true
37
		${WRKSRC}/test/lib/tarantool_server.py \
37
CFLAGS+=	"-O0 -g"
38
		${WRKSRC}/test/lib/*.orig
38
PLIST_SUB+=	CLIENT=""
39
MAN1+=		tarantool.1
40
.else
41
PLIST_SUB+=	CLIENT="@comment "
42
.endif
43
44
.if ${PORT_OPTIONS:MDEBUG}
45
CMAKE_ARGS+=	-DCMAKE_BUILD_TYPE=RelWithDebugInfo
46
.endif
47
48
.if ${PORT_OPTIONS:MSTATIC}
49
CMAKE_ARGS+=	-DENABLE_STATIC=true
50
.endif
39
51
40
post-install:
52
post-install:
41
	@${CAT} ${PKGMESSAGE}
53
	@${CAT} ${PKGMESSAGE}
42
54
43
.include <bsd.port.post.mk>
55
.include <bsd.port.mk>
(-)tarantool/distinfo (-2 / +2 lines)
Lines 1-2 Link Here
1
SHA256 (tarantool-1.3.5-src.tar.gz) = c78eb302eabac7b6ae04a8eadf8b2819e992d2913cdafe1a86222148982351ec
1
SHA256 (tarantool-1.4.8-20-gdfe40fc-src.tar.gz) = bb8095a1e54f4f9a86c64c5750b5e25c1f8ed2467c10ec8a878045da5f2965a9
2
SIZE (tarantool-1.3.5-src.tar.gz) = 829327
2
SIZE (tarantool-1.4.8-20-gdfe40fc-src.tar.gz) = 2243935
(-)tarantool/files/patch-CMakeLists.txt (-11 lines)
Lines 1-11 Link Here
1
--- CMakeLists.txt.orig	2011-11-25 15:33:08.997444924 +0000
2
+++ CMakeLists.txt	2011-11-25 15:33:30.428593855 +0000
3
@@ -197,7 +197,7 @@
4
 add_subdirectory(test)
5
 
6
 install (FILES README LICENSE doc/silverbox-protocol.txt
7
-         DESTINATION doc)
8
+         DESTINATION %%DOCSDIR%%)
9
 
10
 include (cmake/tarantool_cpack.cmake)
11
 #
(-)tarantool/files/patch-doc_man_CMakeLists.txt (+12 lines)
Line 0 Link Here
1
--- doc/man/CMakeLists.txt.orig	2012-12-11 01:42:20.346392205 +0400
2
+++ doc/man/CMakeLists.txt	2012-12-11 01:42:53.437090883 +0400
3
@@ -5,7 +5,7 @@
4
 	    ${CMAKE_SOURCE_DIR}/doc/man/tarantool.pod > ${PROJECT_BINARY_DIR}/doc/man/tarantool.1
5
     )
6
 
7
-install(FILES ${PROJECT_BINARY_DIR}/doc/man/tarantool_box.1 DESTINATION "${CMAKE_MAN_DIR}")
8
+install(FILES ${PROJECT_BINARY_DIR}/doc/man/tarantool_box.1 DESTINATION "${CMAKE_MAN_DIR}/man1")
9
 if (ENABLE_CLIENT)
10
-    install(FILES ${PROJECT_BINARY_DIR}/doc/man/tarantool.1 DESTINATION "${CMAKE_MAN_DIR}")
11
+    install(FILES ${PROJECT_BINARY_DIR}/doc/man/tarantool.1 DESTINATION "${CMAKE_MAN_DIR}/man1")
12
 endif()
(-)tarantool/files/patch-src_CMakeLists.txt (+13 lines)
Line 0 Link Here
1
--- src/CMakeLists.txt.orig	2012-12-11 02:19:57.157548371 +0400
2
+++ src/CMakeLists.txt	2012-12-11 02:23:55.400718104 +0400
3
@@ -155,6 +155,10 @@
4
     set (common_libraries ${common_libraries} dl)
5
 endif()
6
 
7
+if (NOT LINUX)
8
+    set (common_libraries ${common_libraries} intl) # if used not GNU libc, depended by gettext
9
+endif()
10
+
11
 if (ENABLE_GCOV)
12
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCOV_C_FLAGS}")
13
     set (LDFLAGS "${LDFLAGS} ${GCOV_LDFLAGS}")
(-)tarantool/files/patch-test_CMakeLists.txt (-9 / +16 lines)
Lines 1-9 Link Here
1
--- test/CMakeLists.txt.orig	2011-12-11 16:16:40.594230551 +0000
1
--- test/CMakeLists.txt.orig	2012-07-30 17:05:05.000000000 +0400
2
+++ test/CMakeLists.txt	2011-12-11 16:19:44.915010706 +0000
2
+++ test/CMakeLists.txt	2012-11-02 14:25:15.725342910 +0400
3
@@ -9,5 +9,4 @@
3
@@ -18,12 +18,9 @@ else()
4
 
4
     if (NOT CPACK_GENERATOR OR "${CPACK_GENERATOR}" STREQUAL "TGZ")
5
 install (PROGRAMS tarantool DESTINATION bin)
5
         install (FILES ${CMAKE_SOURCE_DIR}/test/share/tarantool_tgz.cfg
6
 install (DIRECTORY lib DESTINATION bin)
6
                  DESTINATION "${CMAKE_SYSCONF_DIR}"
7
-install (FILES box/tarantool.cfg box/00000000000000000001.snap
7
-                 RENAME "tarantool.cfg")
8
-    DESTINATION bin)
8
+                 RENAME "tarantool.cfg.sample")
9
+install (FILES box/tarantool.cfg DESTINATION %%ETCDIR%%)
9
     else()
10
         install (FILES ${CMAKE_SOURCE_DIR}/test/share/tarantool.cfg
11
                  DESTINATION "${CMAKE_SYSCONF_DIR}")
12
     endif()
13
-
14
-    install (FILES ${CMAKE_SOURCE_DIR}/test/box/00000000000000000001.snap
15
-             DESTINATION "${CMAKE_LOCALSTATE_DIR}/lib/tarantool")
16
 endif()
(-)tarantool/files/patch-test_box_tarantool.cfg (-17 lines)
Lines 1-17 Link Here
1
--- test/box/tarantool.cfg.orig	2011-12-13 01:02:02.069760259 +0000
2
+++ test/box/tarantool.cfg	2011-12-13 01:03:52.550055101 +0000
3
@@ -1,11 +1,11 @@
4
 slab_alloc_arena = 0.1
5
 
6
-pid_file = "box.pid"
7
-
8
+pid_file = "/var/run/tarantool.pid"
9
+work_dir = "/var/db/tarantool"
10
 
11
 # Use -a not -a to work correctly on FreeBSD
12
 #
13
-logger="tee -a tarantool.log"
14
+logger="cat >> /var/log/tarantool.log"
15
 
16
 primary_port = 33013
17
 secondary_port = 33014
(-)tarantool/files/patch-test_lib_sql.g (-57 lines)
Lines 1-57 Link Here
1
--- test/lib/sql.g.orig	2011-05-14 12:16:32.000000000 +0000
2
+++ test/lib/sql.g	2011-12-13 00:41:37.729004939 +0000
3
@@ -5,10 +5,6 @@
4
 
5
 %%
6
 
7
-# The grammar below solely covers the functionality provided by
8
-# Tarantool binary protocol, from which follow all the
9
-# limitations. For reference please see doc/box-protocol.txt.
10
-
11
 parser sql:
12
 
13
     ignore:           '\\s+'
14
@@ -25,8 +21,6 @@
15
     token WHERE:      'where'
16
     token VALUES:     'values'
17
     token SET:        'set'
18
-    token OR:         'or'
19
-    token LIMIT:      'limit'
20
     token END:        '\\s*$'
21
 
22
     rule sql:         (insert {{ stmt = insert }} |
23
@@ -37,27 +31,19 @@
24
                       
25
     rule insert:      INSERT [INTO] ident VALUES value_list
26
                       {{ return sql_ast.StatementInsert(ident, value_list) }}
27
-    rule update:      UPDATE ident SET update_list opt_simple_where
28
-                      {{ return sql_ast.StatementUpdate(ident, update_list, opt_simple_where) }}
29
-    rule delete:      DELETE FROM ident opt_simple_where
30
-                      {{ return sql_ast.StatementDelete(ident, opt_simple_where) }}
31
-    rule select:      SELECT '\*' FROM ident opt_where opt_limit
32
-                      {{ return sql_ast.StatementSelect(ident, opt_where, opt_limit) }}
33
+    rule update:      UPDATE ident SET update_list opt_where 
34
+                      {{ return sql_ast.StatementUpdate(ident, update_list, opt_where) }}
35
+    rule delete:      DELETE FROM ident opt_where
36
+                      {{ return sql_ast.StatementDelete(ident, opt_where) }}
37
+    rule select:      SELECT '\*' FROM ident opt_where
38
+                      {{ return sql_ast.StatementSelect(ident, opt_where) }}
39
     rule ping:        PING
40
                       {{ return sql_ast.StatementPing() }}
41
     rule predicate:   ident '=' constant
42
                       {{ return (ident, constant) }}
43
-    rule opt_simple_where:   {{ return None }}
44
+    rule opt_where:   {{ return None }}
45
                       | WHERE predicate
46
                       {{ return predicate }}
47
-    rule opt_where:   {{ return None }}
48
-                      | WHERE disjunction
49
-                      {{ return disjunction }}
50
-    rule disjunction: predicate {{ disjunction = [predicate] }}
51
-                      [(OR predicate {{ disjunction.append(predicate) }})+]
52
-                      {{ return disjunction }}
53
-    rule opt_limit:   {{ return 0xffffffff }}
54
-                      | LIMIT NUM {{ return int(NUM) }}
55
     rule value_list:  '\(' expr {{ value_list = [expr] }}
56
                           [("," expr {{ value_list.append(expr) }} )+]
57
                       '\)' {{ return value_list }}
(-)tarantool/files/patch-test_lib_sql.py (-92 lines)
Lines 1-92 Link Here
1
--- test/lib/sql.py.orig	2011-05-14 12:16:32.000000000 +0000
2
+++ test/lib/sql.py	2011-12-13 00:23:04.673107891 +0000
3
@@ -30,8 +30,6 @@
4
         ('WHERE', re.compile('where')),
5
         ('VALUES', re.compile('values')),
6
         ('SET', re.compile('set')),
7
-        ('OR', re.compile('or')),
8
-        ('LIMIT', re.compile('limit')),
9
         ('END', re.compile('\\s*$')),
10
     ]
11
     def __init__(self, str,*args,**kw):
12
@@ -76,16 +74,16 @@
13
         ident = self.ident(_context)
14
         SET = self._scan('SET', context=_context)
15
         update_list = self.update_list(_context)
16
-        opt_simple_where = self.opt_simple_where(_context)
17
-        return sql_ast.StatementUpdate(ident, update_list, opt_simple_where)
18
+        opt_where = self.opt_where(_context)
19
+        return sql_ast.StatementUpdate(ident, update_list, opt_where)
20
 
21
     def delete(self, _parent=None):
22
         _context = self.Context(_parent, self._scanner, 'delete', [])
23
         DELETE = self._scan('DELETE', context=_context)
24
         FROM = self._scan('FROM', context=_context)
25
         ident = self.ident(_context)
26
-        opt_simple_where = self.opt_simple_where(_context)
27
-        return sql_ast.StatementDelete(ident, opt_simple_where)
28
+        opt_where = self.opt_where(_context)
29
+        return sql_ast.StatementDelete(ident, opt_where)
30
 
31
     def select(self, _parent=None):
32
         _context = self.Context(_parent, self._scanner, 'select', [])
33
@@ -94,8 +92,7 @@
34
         FROM = self._scan('FROM', context=_context)
35
         ident = self.ident(_context)
36
         opt_where = self.opt_where(_context)
37
-        opt_limit = self.opt_limit(_context)
38
-        return sql_ast.StatementSelect(ident, opt_where, opt_limit)
39
+        return sql_ast.StatementSelect(ident, opt_where)
40
 
41
     def ping(self, _parent=None):
42
         _context = self.Context(_parent, self._scanner, 'ping', [])
43
@@ -109,8 +106,8 @@
44
         constant = self.constant(_context)
45
         return (ident, constant)
46
 
47
-    def opt_simple_where(self, _parent=None):
48
-        _context = self.Context(_parent, self._scanner, 'opt_simple_where', [])
49
+    def opt_where(self, _parent=None):
50
+        _context = self.Context(_parent, self._scanner, 'opt_where', [])
51
         _token = self._peek('WHERE', 'END', context=_context)
52
         if _token == 'END':
53
             return None
54
@@ -119,38 +116,6 @@
55
             predicate = self.predicate(_context)
56
             return predicate
57
 
58
-    def opt_where(self, _parent=None):
59
-        _context = self.Context(_parent, self._scanner, 'opt_where', [])
60
-        _token = self._peek('WHERE', 'LIMIT', 'END', context=_context)
61
-        if _token != 'WHERE':
62
-            return None
63
-        else: # == 'WHERE'
64
-            WHERE = self._scan('WHERE', context=_context)
65
-            disjunction = self.disjunction(_context)
66
-            return disjunction
67
-
68
-    def disjunction(self, _parent=None):
69
-        _context = self.Context(_parent, self._scanner, 'disjunction', [])
70
-        predicate = self.predicate(_context)
71
-        disjunction = [predicate]
72
-        if self._peek('OR', 'LIMIT', 'END', context=_context) == 'OR':
73
-            while 1:
74
-                OR = self._scan('OR', context=_context)
75
-                predicate = self.predicate(_context)
76
-                disjunction.append(predicate)
77
-                if self._peek('OR', 'LIMIT', 'END', context=_context) != 'OR': break
78
-        return disjunction
79
-
80
-    def opt_limit(self, _parent=None):
81
-        _context = self.Context(_parent, self._scanner, 'opt_limit', [])
82
-        _token = self._peek('LIMIT', 'END', context=_context)
83
-        if _token == 'END':
84
-            return 0xffffffff
85
-        else: # == 'LIMIT'
86
-            LIMIT = self._scan('LIMIT', context=_context)
87
-            NUM = self._scan('NUM', context=_context)
88
-            return int(NUM)
89
-
90
     def value_list(self, _parent=None):
91
         _context = self.Context(_parent, self._scanner, 'value_list', [])
92
         self._scan("'\\('", context=_context)
(-)tarantool/files/patch-test_lib_sql_ast.py (-45 lines)
Lines 1-45 Link Here
1
--- test/lib/sql_ast.py.orig	2011-05-14 12:16:32.000000000 +0000
2
+++ test/lib/sql_ast.py	2011-12-13 00:23:04.673107891 +0000
3
@@ -242,22 +242,16 @@
4
 class StatementSelect(StatementPing):
5
   reqeust_type = SELECT_REQUEST_TYPE
6
 
7
-  def __init__(self, table_name, where, limit):
8
+  def __init__(self, table_name, where):
9
     self.namespace_no = table_name
10
-    self.index_no = None
11
-    self.key_list = []
12
-    if not where:
13
-      self.index_no = 0
14
-      self.key_list = ["",]
15
+    if where:
16
+      (self.index_no, key) = where
17
+      self.key = [key]
18
     else:
19
-      for (index_no, key) in where:
20
-        self.key_list.append(key)
21
-        if self.index_no == None:
22
-          self.index_no = index_no
23
-        elif self.index_no != index_no:
24
-          raise RuntimeError("All key values in a disjunction must refer to the same index")
25
+      self.index_no = 0
26
+      self.key = [""]
27
     self.offset = 0
28
-    self.limit = limit
29
+    self.limit = 0xffffffff
30
 
31
   def pack(self):
32
     buf = ctypes.create_string_buffer(PACKET_BUF_LEN)
33
@@ -266,10 +260,8 @@
34
                      self.index_no,
35
                      self.offset,
36
                      self.limit,
37
-                     len(self.key_list))
38
-    offset = SELECT_REQUEST_FIXED_LEN
39
-    for key in self.key_list:
40
-      (buf, offset) = pack_tuple([key], buf, offset)
41
+                     1)
42
+    (buf, offset) = pack_tuple(self.key, buf, SELECT_REQUEST_FIXED_LEN)
43
 
44
     return buf[:offset]
45
 
(-)tarantool/files/patch-test_lib_tarantool_connection.py (-158 lines)
Lines 1-158 Link Here
1
--- test/lib/tarantool_connection.py.orig	1970-01-01 00:00:00.000000000 +0000
2
+++ test/lib/tarantool_connection.py	2011-12-13 00:23:04.673107891 +0000
3
@@ -0,0 +1,155 @@
4
+__author__ = "Konstantin Osipov <kostja.osipov@gmail.com>"
5
+
6
+# Redistribution and use in source and binary forms, with or without
7
+# modification, are permitted provided that the following conditions
8
+# are met:
9
+# 1. Redistributions of source code must retain the above copyright
10
+#    notice, this list of conditions and the following disclaimer.
11
+# 2. Redistributions in binary form must reproduce the above copyright
12
+#    notice, this list of conditions and the following disclaimer in the
13
+#    documentation and/or other materials provided with the distribution.
14
+#
15
+# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
+# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
+# SUCH DAMAGE.
26
+
27
+import socket
28
+import sys
29
+import string
30
+import cStringIO
31
+import yaml
32
+import re
33
+import sql
34
+import struct
35
+import errno
36
+
37
+is_admin_re = re.compile("^\s*(show|save|exec|exit|reload|help)", re.I)
38
+
39
+class AdminConnection:
40
+  def __init__(self, host, port):
41
+    self.host = host
42
+    self.port = port
43
+    self.is_connected = False
44
+    self.stream = cStringIO.StringIO()
45
+
46
+  def connect(self):
47
+    self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
48
+    self.socket.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
49
+    self.socket.connect((self.host, self.port))
50
+    self.is_connected = True
51
+
52
+  def disconnect(self):
53
+    if self.is_connected:
54
+      self.socket.close()
55
+      self.is_connected = False
56
+
57
+  def reconnect(self):
58
+    self.disconnect()
59
+    self.connect()
60
+
61
+  def opt_reconnect(self):
62
+    """ On a socket which was disconnected, recv of 0 bytes immediately
63
+        returns with no data. On a socket which is alive, it returns EAGAIN.
64
+        Make use of this property and detect whether or not the socket is
65
+        dead. Reconnect a dead socket, do nothing if the socket is good."""
66
+    try:
67
+      if self.socket.recv(0, socket.MSG_DONTWAIT) == '':
68
+        self.reconnect()
69
+    except socket.error as e:
70
+      if e.errno == errno.EAGAIN:
71
+        pass
72
+      else:
73
+        self.reconnect()
74
+
75
+  def execute(self, command):
76
+    self.opt_reconnect()
77
+    return self.execute_no_reconnect(command)
78
+
79
+  def execute_no_reconnect(self, command):
80
+    self.socket.sendall(command)
81
+
82
+    bufsiz = 4096
83
+    res = ""
84
+
85
+    while True:
86
+      buf = self.socket.recv(bufsiz)
87
+      if not buf:
88
+        break
89
+      res = res + buf;
90
+      if (res.rfind("\r\n...\r\n") >= 0):
91
+        break
92
+
93
+    # validate yaml by parsing it
94
+    yaml.load(res)
95
+
96
+    return res
97
+
98
+  def write(self, fragment):
99
+    """This is to support print >> admin, "command" syntax.
100
+    For every print statement, write is invoked twice: one to
101
+    write the command itself, and another to write \n. We should
102
+    accumulate all writes until we receive \n. When we receive it,
103
+    we execute the command, and rewind the stream."""
104
+       
105
+    newline_pos = fragment.rfind("\n")
106
+    while newline_pos >= 0:
107
+      self.stream.write(fragment[:newline_pos+1])
108
+      statement = self.stream.getvalue()
109
+      sys.stdout.write(statement)
110
+      sys.stdout.write(self.execute(statement))
111
+      fragment = fragment[newline_pos+1:]
112
+      newline_pos = fragment.rfind("\n")
113
+      self.stream.seek(0)
114
+      self.stream.truncate()
115
+
116
+    self.stream.write(fragment)
117
+
118
+  def __enter__(self):
119
+    self.connect()
120
+    return self
121
+
122
+  def __exit__(self, type, value, tb):
123
+    self.disconnect()
124
+
125
+class DataConnection(AdminConnection):
126
+
127
+  def recvall(self, length):
128
+    res = ""
129
+    while len(res) < length:
130
+      buf = self.socket.recv(length - len(res))
131
+      res = res + buf
132
+    return res
133
+
134
+  def execute_no_reconnect(self, command):
135
+    statement = sql.parse("sql", command)
136
+    if statement == None:
137
+      return "You have an error in your SQL syntax\n"
138
+
139
+    payload = statement.pack()
140
+    header = struct.pack("<lll", statement.reqeust_type, len(payload), 0)
141
+
142
+    self.socket.sendall(header)
143
+    if len(payload):
144
+      self.socket.sendall(payload)
145
+
146
+    IPROTO_HEADER_SIZE = 12
147
+
148
+    header = self.recvall(IPROTO_HEADER_SIZE)
149
+
150
+    response_len = struct.unpack("<lll", header)[1]
151
+
152
+    if response_len:
153
+      response = self.recvall(response_len)
154
+    else:
155
+      response = None
156
+    
157
+    return statement.unpack(response) + "\n"
158
+
(-)tarantool/files/patch-test_lib_tarantool_silverbox_server.py (-266 lines)
Lines 1-266 Link Here
1
--- test/lib/tarantool_silverbox_server.py.orig	2011-05-14 12:16:32.000000000 +0000
2
+++ test/lib/tarantool_silverbox_server.py	2011-12-13 00:23:04.673107891 +0000
3
@@ -1,35 +1,234 @@
4
+import os
5
+import stat
6
 import shutil
7
 import subprocess
8
-import yaml
9
-import ConfigParser
10
-from tarantool_server import TarantoolServer, TarantoolConfigFile
11
-from tarantool_admin import TarantoolAdmin
12
-from silverbox import Silverbox
13
-
14
-class TarantoolSilverboxServer(TarantoolServer):
15
-  def __new__(cls, core="tarantool", module="silverbox"):
16
-    return TarantoolServer.__new__(cls)
17
-
18
-  def __init__(self, core="tarantool", module="silverbox"):
19
-    TarantoolServer.__init__(self, core, module)
20
-
21
-  def configure(self, config):
22
-    TarantoolServer.configure(self, config)
23
-    with open(self.config) as fp:
24
-      dummy_section_name = "tarantool"
25
-      config = ConfigParser.ConfigParser()
26
-      config.readfp(TarantoolConfigFile(fp, dummy_section_name))
27
-      self.primary_port = int(config.get(dummy_section_name, "primary_port"))
28
-      self.admin_port = int(config.get(dummy_section_name, "admin_port"))
29
-      self.port = self.admin_port
30
-      self.admin = TarantoolAdmin("localhost", self.admin_port)
31
-      self.sql = Silverbox("localhost", self.primary_port)
32
-
33
-  def init(self):
34
-# init storage
35
-    subprocess.check_call([self.binary, "--init_storage"],
36
-                          cwd = self.vardir,
37
+import pexpect
38
+import sys
39
+import signal
40
+import time
41
+import socket
42
+import daemon
43
+import glob
44
+
45
+def wait_until_connected(host, port):
46
+  """Wait until the server is started and accepting connections"""
47
+  is_connected = False
48
+  while not is_connected:
49
+    try:
50
+      sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
51
+      sock.connect((host, port))
52
+      is_connected = True
53
+      sock.close()
54
+    except socket.error as e:
55
+      time.sleep(0.001)
56
+
57
+
58
+def prepare_gdb(args):
59
+  """Prepare server startup arguments to run under gdb."""
60
+  if "TERM" in os.environ:
61
+    term = os.environ["TERM"]
62
+  else:
63
+    term = "xterm"
64
+
65
+  if term not in ["xterm", "rxvt", "urxvt", "gnome-terminal", "konsole"]:
66
+    raise RuntimeError("--gdb: unsupported terminal {0}".format(term))
67
+
68
+  args = [ term, "-e ", "gdb", "-ex", "break main", "-ex", "run"] + args
69
+  return args
70
+
71
+
72
+def prepare_valgrind(args, valgrind_opts):
73
+  "Prepare server startup arguments to run under valgrind."
74
+  args = ([ "valgrind", "--log-file=valgrind.log", "--quiet" ] +
75
+          valgrind_opts.split(" ") + args)
76
+  return args
77
+
78
+
79
+def check_tmpfs_exists():
80
+  return os.uname()[0] in 'Linux' and os.path.isdir("/dev/shm")
81
+
82
+def create_tmpfs_vardir(vardir):
83
+  os.mkdir(os.path.join("/dev/shm", vardir))
84
+  os.symlink(os.path.join("/dev/shm", vardir), vardir)
85
+
86
+class TarantoolSilverboxServer:
87
+  """Server represents a single server instance. Normally, the
88
+  program operates with only one server, but in future we may add
89
+  replication slaves. The server is started once at the beginning
90
+  of each suite, and stopped at the end."""
91
+
92
+  def __init__(self, args, suite_ini):
93
+    """Set server options: path to configuration file, pid file, exe, etc."""
94
+    self.args = args
95
+    self.suite_ini = suite_ini
96
+    self.path_to_pidfile = os.path.join(args.vardir, suite_ini["pidfile"])
97
+    self.path_to_exe = None
98
+    self.abspath_to_exe = None
99
+    self.is_started = False
100
+
101
+  def install(self, silent = False):
102
+    """Start server instance: check if the old one exists, kill it
103
+    if necessary, create necessary directories and files, start
104
+    the server. The server working directory is taken from 'vardir',
105
+    specified in the prgoram options.
106
+    Currently this is implemented for tarantool_silverbox only."""
107
+
108
+    vardir = self.args.vardir
109
+
110
+    if not silent:
111
+      print "Installing the server..."
112
+
113
+    if self.path_to_exe == None:
114
+      self.path_to_exe = self.find_exe()
115
+      self.abspath_to_exe = os.path.abspath(self.path_to_exe)
116
+
117
+    if not silent:
118
+      print "  Found executable at " + self.path_to_exe + "."
119
+
120
+    if not silent:
121
+      print "  Creating and populating working directory in " +\
122
+      vardir + "..."
123
+
124
+    if os.access(vardir, os.F_OK):
125
+      if not silent:
126
+        print "  Found old vardir, deleting..."
127
+      self.kill_old_server()
128
+      for filename in (glob.glob(os.path.join(vardir, "*.snap")) +
129
+                      glob.glob(os.path.join(vardir, "*.inprogress")) +
130
+                      glob.glob(os.path.join(vardir, "*.xlog")) +
131
+                      glob.glob(os.path.join(vardir, "*.cfg")) +
132
+                      glob.glob(os.path.join(vardir, "*.log")) +
133
+                      glob.glob(os.path.join(vardir, "*.core.*")) +
134
+                      glob.glob(os.path.join(vardir, "core"))):
135
+        os.remove(filename)
136
+    else:
137
+      if (self.args.mem == True and check_tmpfs_exists() and
138
+          os.path.basename(vardir) == vardir):
139
+        create_tmpfs_vardir(vardir)
140
+      else:
141
+        os.mkdir(vardir)
142
+
143
+    shutil.copy(self.suite_ini["config"], self.args.vardir)
144
+
145
+    subprocess.check_call([self.abspath_to_exe, "--init_storage"],
146
+                          cwd = self.args.vardir,
147
 # catch stdout/stderr to not clutter output
148
                           stdout = subprocess.PIPE,
149
                           stderr = subprocess.PIPE)
150
 
151
+    p = subprocess.Popen([self.abspath_to_exe, "--version"],
152
+                         cwd = self.args.vardir,
153
+                         stdout = subprocess.PIPE)
154
+    version = p.stdout.read().rstrip()
155
+    p.wait()
156
+
157
+    if not silent:
158
+      print "Starting {0} {1}.".format(os.path.basename(self.abspath_to_exe),
159
+                                       version)
160
+
161
+  def start(self, silent = False):
162
+
163
+    if self.is_started:
164
+      if not silent:
165
+        print "The server is already started."
166
+      return
167
+
168
+    if not silent:
169
+      print "Starting the server..."
170
+
171
+    args = [self.abspath_to_exe]
172
+
173
+    if (self.args.start_and_exit and
174
+        not self.args.valgrind and not self.args.gdb):
175
+      args.append("--daemonize")
176
+    if self.args.gdb:
177
+      args = prepare_gdb(args)
178
+    elif self.args.valgrind:
179
+      args = prepare_valgrind(args, self.args.valgrind_opts)
180
+
181
+    if self.args.start_and_exit and self.args.valgrind:
182
+      pid = os.fork()
183
+      if pid > 0:
184
+        os.wait()
185
+      else:
186
+        with daemon.DaemonContext(working_directory = self.args.vardir):
187
+	  os.execvp(args[0], args)
188
+    else:
189
+      self.server = pexpect.spawn(args[0], args[1:], cwd = self.args.vardir)
190
+      if self.args.start_and_exit:
191
+        self.server.wait()
192
+
193
+# wait until the server is connectedk
194
+    if self.args.gdb and self.args.start_and_exit:
195
+      time.sleep(1)
196
+    elif not self.args.start_and_exit and not self.args.gdb:
197
+      self.server.expect_exact("entering event loop")
198
+    else:
199
+      wait_until_connected(self.suite_ini["host"], self.suite_ini["port"])
200
+
201
+# Set is_started flag, to nicely support cleanup during an exception.
202
+    self.is_started = True
203
+
204
+
205
+  def stop(self, silent = False):
206
+    """Stop server instance. Do nothing if the server is not started,
207
+    to properly shut down the server in case of an exception during
208
+    start up."""
209
+    if self.is_started:
210
+      if not silent:
211
+        print "Stopping the server..."
212
+      if self.args.gdb:
213
+        self.kill_old_server(True)
214
+      self.server.terminate()
215
+      self.server.expect(pexpect.EOF)
216
+      self.is_started = False
217
+    elif not silent:
218
+      print "The server is not started."
219
+
220
+  def restart(self):
221
+    self.stop(True)
222
+    self.start(True)
223
+
224
+  def test_option(self, option_list_str):
225
+      args = [self.abspath_to_exe] + option_list_str.split()
226
+      print " ".join([os.path.basename(self.abspath_to_exe)] + args[1:])
227
+      output = subprocess.Popen(args,
228
+                                cwd = self.args.vardir,
229
+                                stdout = subprocess.PIPE,
230
+                                stderr = subprocess.STDOUT).stdout.read()
231
+      print output
232
+
233
+
234
+  def find_exe(self):
235
+    """Locate server executable in the bindir. We just take
236
+    the first thing looking like an exe in there."""
237
+
238
+    print "  Looking for server binary in {0}...".format(self.args.bindir)
239
+    if (os.access(self.args.bindir, os.F_OK) == False or
240
+        stat.S_ISDIR(os.stat(self.args.bindir).st_mode) == False):
241
+      raise RuntimeError("Directory " + self.args.bindir + " doesn't exist")
242
+
243
+    for f in os.listdir(self.args.bindir):
244
+      f = os.path.join(self.args.bindir, f)
245
+      st_mode = os.stat(f).st_mode
246
+      if stat.S_ISREG(st_mode) and st_mode & stat.S_IXUSR:
247
+        return f
248
+
249
+    raise RuntimeError("Can't find server executable in " + self.args.bindir)
250
+
251
+  def kill_old_server(self, silent = False):
252
+    """Kill old server instance if it exists."""
253
+    if os.access(self.path_to_pidfile, os.F_OK) == False:
254
+      return # Nothing to do
255
+    pid = 0
256
+    with open(self.path_to_pidfile) as f:
257
+      pid = int(f.read())
258
+    if not silent:
259
+      print "  Found old server, pid {0}, killing...".format(pid)
260
+    try:
261
+      os.kill(pid, signal.SIGTERM)
262
+      while os.kill(pid, 0) != -1:
263
+        time.sleep(0.001)
264
+    except OSError:
265
+      pass
266
+
(-)tarantool/files/patch-test_lib_test_suite.py (-210 lines)
Lines 1-210 Link Here
1
--- test/lib/test_suite.py.orig	2011-05-14 12:16:32.000000000 +0000
2
+++ test/lib/test_suite.py	2011-12-13 00:23:04.673107891 +0000
3
@@ -10,13 +10,21 @@
4
 import filecmp
5
 import shlex
6
 import time
7
-from server import Server
8
+from tarantool_silverbox_server import TarantoolSilverboxServer
9
+from tarantool_connection import AdminConnection, DataConnection
10
 import tarantool_preprocessor
11
 import re
12
 import cStringIO
13
 import string
14
 import traceback
15
 
16
+class TestRunException(RuntimeError):
17
+  """A common exception to use across the program."""
18
+  def __init__(self, message):
19
+    self.message = message
20
+  def __str__(self):
21
+    return self.message
22
+
23
 class FilteredStream:
24
   """Helper class to filter .result file output"""
25
   def __init__(self, filename):
26
@@ -66,12 +74,12 @@
27
     """Initialize test properties: path to test file, path to
28
     temporary result file, path to the client program, test status."""
29
     self.name = name
30
-    self.args = args
31
-    self.suite_ini = suite_ini
32
     self.result = name.replace(".test", ".result")
33
-    self.tmp_result = os.path.join(self.args.vardir,
34
+    self.tmp_result = os.path.join(suite_ini["vardir"],
35
                                    os.path.basename(self.result))
36
     self.reject = name.replace(".test", ".reject")
37
+    self.args = args
38
+    self.suite_ini = suite_ini
39
     self.is_executed = False
40
     self.is_executed_ok = None
41
     self.is_equal_result = None
42
@@ -81,7 +89,7 @@
43
     """Return true if this test was run successfully."""
44
     return self.is_executed and self.is_executed_ok and self.is_equal_result
45
 
46
-  def run(self, server):
47
+  def run(self):
48
     """Execute the test assuming it's a python program.
49
     If the test aborts, print its output to stdout, and raise
50
     an exception. Else, comprare result and reject files.
51
@@ -91,10 +99,18 @@
52
 
53
     diagnostics = "unknown"
54
     save_stdout = sys.stdout
55
+    admin = AdminConnection(self.suite_ini["host"],
56
+                            self.suite_ini["admin_port"])
57
+    sql = DataConnection(self.suite_ini["host"],
58
+                         self.suite_ini["port"])
59
+    server = self.suite_ini["server"]
60
     try:
61
+      admin.connect()
62
+      sql.connect()
63
       sys.stdout = FilteredStream(self.tmp_result)
64
-      stdout_fileno = sys.stdout.stream.fileno()
65
-      execfile(self.name, dict(locals(), **server.__dict__))
66
+      server = self.suite_ini["server"]
67
+      vardir = self.suite_ini["vardir"]
68
+      execfile(self.name, globals(), locals())
69
       self.is_executed_ok = True
70
     except Exception as e:
71
       traceback.print_exc(e)
72
@@ -103,6 +119,8 @@
73
       if sys.stdout and sys.stdout != save_stdout:
74
         sys.stdout.close()
75
       sys.stdout = save_stdout;
76
+      admin.disconnect()
77
+      sql.disconnect()
78
 
79
     self.is_executed = True
80
 
81
@@ -111,7 +129,7 @@
82
 
83
     if self.args.valgrind:
84
       self.is_valgrind_clean = \
85
-      check_valgrind_log(server.valgrind_log) == False
86
+      check_valgrind_log(self.suite_ini["valgrind_log"]) == False
87
 
88
     if self.is_executed_ok and self.is_equal_result and self.is_valgrind_clean:
89
       print "[ pass ]"
90
@@ -133,12 +151,12 @@
91
         where = ": wrong test output"
92
       elif not self.is_valgrind_clean:
93
         os.remove(self.reject)
94
-        self.print_diagnostics(server.valgrind_log,
95
+        self.print_diagnostics(self.suite_ini["valgrind_log"],
96
                                "Test failed! Last 10 lines of valgrind.log:")
97
         where = ": there were warnings in valgrind.log"
98
 
99
-      if not self.args.is_force:
100
-        raise RuntimeError("Failed to run test " + self.name + where)
101
+      if not self.suite_ini["is_force"]:
102
+        raise TestRunException("Failed to run test " + self.name + where)
103
 
104
 
105
   def print_diagnostics(self, logfile, message):
106
@@ -167,6 +185,20 @@
107
         for line in diff:
108
           sys.stdout.write(line)
109
 
110
+class TarantoolConfigFile:
111
+  """ConfigParser can't read files without sections, work it around"""
112
+  def __init__(self, fp, section_name):
113
+    self.fp = fp
114
+    self.section_name = "[" + section_name + "]"
115
+  def readline(self):
116
+    if self.section_name:
117
+      section_name = self.section_name
118
+      self.section_name = None
119
+      return section_name
120
+    # tarantool.cfg puts string values in quote
121
+    return self.fp.readline().replace("\"", '')
122
+
123
+
124
 class TestSuite:
125
   """Each test suite contains a number of related tests files,
126
   located in the same directory on disk. Each test file has
127
@@ -186,13 +218,15 @@
128
     self.args = args
129
     self.tests = []
130
     self.ini = {}
131
-
132
-    self.ini["core"] = "tarantool"
133
-    self.ini["module"] = "silverbox"
134
+    self.ini["suite_path"] = suite_path
135
+    self.ini["host"] = "localhost"
136
+    self.ini["is_force"] = self.args.is_force
137
+    self.ini["vardir"] = args.vardir
138
+    self.ini["valgrind_log"] = os.path.join(args.vardir, "valgrind.log")
139
 
140
     if os.access(suite_path, os.F_OK) == False:
141
-      raise RuntimeError("Suite \"" + suite_path +\
142
-                         "\" doesn't exist")
143
+      raise TestRunException("Suite \"" + suite_path +\
144
+                             "\" doesn't exist")
145
 
146
 # read the suite config
147
     config = ConfigParser.ConfigParser()
148
@@ -203,6 +237,16 @@
149
       self.ini["disabled"] = dict.fromkeys(self.ini["disabled"].split(" "))
150
     else:
151
       self.ini["disabled"] = dict()
152
+# import the necessary module for test suite client
153
+
154
+# now read the server config, we need some properties from it
155
+
156
+    with open(self.ini["config"]) as fp:
157
+      dummy_section_name = "tarantool_silverbox"
158
+      config.readfp(TarantoolConfigFile(fp, dummy_section_name))
159
+      self.ini["pidfile"] = config.get(dummy_section_name, "pid_file")
160
+      self.ini["admin_port"] = int(config.get(dummy_section_name, "admin_port"))
161
+      self.ini["port"] = int(config.get(dummy_section_name, "primary_port"))
162
 
163
     print "Collecting tests in \"" + suite_path + "\": " +\
164
       self.ini["description"] + "."
165
@@ -216,17 +260,9 @@
166
   def run_all(self):
167
     """For each file in the test suite, run client program
168
     assuming each file represents an individual test."""
169
-    try:
170
-      server = Server(self.ini["core"], self.ini["module"])
171
-    except Exception as e:
172
-      print e
173
-      raise RuntimeError("Unknown server: core = {0}, module = {1}".format(
174
-        self.ini["core"], self.ini["module"]))
175
-    server.deploy(self.ini["config"],
176
-                  server.find_exe(self.args.builddir, silent=False),
177
-		  self.args.vardir,
178
-                  self.args.mem, self.args.start_and_exit, self.args.gdb, self.args.valgrind,
179
-		  silent=False)
180
+    server = TarantoolSilverboxServer(self.args, self.ini)
181
+    server.install()
182
+    server.start()
183
     if self.args.start_and_exit:
184
       print "  Start and exit requested, exiting..."
185
       exit(0)
186
@@ -247,7 +283,7 @@
187
       if os.path.basename(test.name) in self.ini["disabled"]:
188
         print "[ skip ]"
189
       else:
190
-        test.run(server)
191
+        test.run()
192
         if not test.passed():
193
           failed_tests.append(test.name)
194
 
195
@@ -255,11 +291,9 @@
196
     if len(failed_tests):
197
       print "Failed {0} tests: {1}.".format(len(failed_tests),
198
                                             ", ".join(failed_tests))
199
-    server.stop(silent=False)
200
-    server.cleanup()
201
+    server.stop();
202
 
203
-    if self.args.valgrind and check_valgrind_log(server.valgrind_log):
204
+    if self.args.valgrind and check_valgrind_log(self.ini["valgrind_log"]):
205
       print "  Error! There were warnings/errors in valgrind log file:"
206
-      print_tail_n(server.valgrind_log, 20)
207
-      return 1
208
-    return len(failed_tests)
209
+      print_tail_n(self.ini["valgrind_log"], 20)
210
+
(-)tarantool/files/patch-test_tarantool (-30 lines)
Lines 1-30 Link Here
1
--- test/tarantool.orig	2011-05-14 12:16:32.000000000 +0000
2
+++ test/tarantool	2011-12-13 01:12:12.696699437 +0000
3
@@ -1,4 +1,4 @@
4
-#! /usr/bin/python 
5
+#! /usr/bin/env python 
6
 """A simplistic client for tarantool/silverbox: administrative
7
 console and SQL client.
8
 
9
@@ -32,8 +32,8 @@
10
 import socket
11
 import sys
12
 import string
13
-from lib.tarantool_admin import TarantoolAdmin, is_admin_re
14
-from lib.box import Box
15
+from lib.tarantool_connection import AdminConnection, DataConnection, \
16
+       is_admin_re
17
 
18
 class Options:
19
   def __init__(self):
20
@@ -94,8 +94,8 @@
21
 def main():
22
   init_readline_history()
23
   options = Options()
24
-  admin_con = TarantoolAdmin(options.args.host, options.args.admin_port)
25
-  data_con = Box(options.args.host, options.args.port)
26
+  admin_con = AdminConnection(options.args.host, options.args.admin_port)
27
+  data_con = DataConnection(options.args.host, options.args.port)
28
   try:
29
     admin_con.connect()
30
     data_con.connect()
(-)tarantool/files/pkg-message.in (-2 / +5 lines)
Lines 1-9 Link Here
1
#########################################################
1
#########################################################
2
#
2
#
3
#
3
#
4
#        After install you'll need init storage:
4
#        After install you'll need:
5
#
5
#
6
#    %%PREFIX%%/bin/tarantool_silverbox --init-storage \
6
#    Edit example config:
7
#    %%ETCDIR%%/tarantool.cfg.sample
8
#    Init storage:
9
#    %%PREFIX%%/bin/tarantool_box --init-storage \
7
#    	-c %%ETCDIR%%/tarantool.cfg
10
#    	-c %%ETCDIR%%/tarantool.cfg
8
#
11
#
9
#
12
#
(-)tarantool/files/tarantool.in (-2 / +2 lines)
Lines 1-6 Link Here
1
#!/bin/sh
1
#!/bin/sh
2
#
2
#
3
# $FreeBSD: ports/databases/tarantool/files/tarantool.in,v 1.3 2012/11/17 05:55:25 svnexp Exp $
3
# $FreeBSD: ports/databases/tarantool/files/tarantool.in,v 1.2 2012/01/14 08:55:33 dougb Exp $
4
4
5
# PROVIDE: tarantool
5
# PROVIDE: tarantool
6
# REQUIRE: LOGIN
6
# REQUIRE: LOGIN
Lines 20-26 Link Here
20
tarantool_enable=${tarantool_enable:-"NO"}
20
tarantool_enable=${tarantool_enable:-"NO"}
21
tarantool_config=${tarantool_config:-"%%ETCDIR%%/$name.cfg"}
21
tarantool_config=${tarantool_config:-"%%ETCDIR%%/$name.cfg"}
22
22
23
command="%%PREFIX%%/bin/tarantool_silverbox"
23
command="%%PREFIX%%/bin/tarantool_box"
24
command_args="--daemonize --config ${tarantool_config}"
24
command_args="--daemonize --config ${tarantool_config}"
25
pidfile="/var/run/$name.pid"
25
pidfile="/var/run/$name.pid"
26
26
(-)tarantool/pkg-plist (-19 / +52 lines)
Lines 1-21 Link Here
1
bin/lib/__init__.py
1
include/tarantool/tnt.h
2
bin/lib/sql.g
2
include/tarantool/tnt_buf.h
3
bin/lib/sql.py
3
include/tarantool/tnt_call.h
4
bin/lib/sql_ast.py
4
include/tarantool/tnt_delete.h
5
bin/lib/tarantool_connection.py
5
include/tarantool/tnt_dir.h
6
bin/lib/tarantool_preprocessor.py
6
include/tarantool/tnt_enc.h
7
bin/lib/tarantool_silverbox_server.py
7
include/tarantool/tnt_insert.h
8
bin/lib/test_suite.py
8
include/tarantool/tnt_io.h
9
bin/lib/yapps/__init__.py
9
include/tarantool/tnt_iob.h
10
bin/lib/yapps/runtime.py
10
include/tarantool/tnt_iter.h
11
bin/tarantool
11
include/tarantool/tnt_lex.h
12
bin/tarantool_feeder
12
include/tarantool/tnt_log.h
13
bin/tarantool_silverbox
13
include/tarantool/tnt_mem.h
14
%%DOCSDIR%%/LICENSE
14
include/tarantool/tnt_net.h
15
include/tarantool/tnt_opt.h
16
include/tarantool/tnt_ping.h
17
include/tarantool/tnt_proto.h
18
include/tarantool/tnt_queue.h
19
include/tarantool/tnt_reply.h
20
include/tarantool/tnt_request.h
21
include/tarantool/tnt_rpl.h
22
include/tarantool/tnt_select.h
23
include/tarantool/tnt_snapshot.h
24
include/tarantool/tnt_sql.h
25
include/tarantool/tnt_stream.h
26
include/tarantool/tnt_tuple.h
27
include/tarantool/tnt_update.h
28
include/tarantool/tnt_utf8.h
29
include/tarantool/tnt_xlog.h
30
etc/tarantool.cfg.sample
31
bin/tarantool_box
32
bin/tarantool_checksum
33
%%CLIENT%%bin/tarantool
34
lib/libtarantoolnet.so.1.1
35
lib/libtarantoolrpl.so.1
36
lib/libtarantoolnet.a
37
lib/libtarantoolnet.so
38
lib/libtarantool.a
39
lib/libtarantoolnet.so.1
40
lib/libtarantoolrpl.so
41
lib/libtarantoolsql.so.1.1
42
lib/libtarantoolsql.a
43
lib/libtarantoolsql.so.1
44
lib/libtarantoolrpl.so.1.1
45
lib/libtarantool.so.1
46
lib/libtarantoolsql.so
47
lib/libtarantool.so.1.1
48
lib/libtarantoolrpl.a
49
lib/libtarantool.so
15
%%DOCSDIR%%/README
50
%%DOCSDIR%%/README
16
%%DOCSDIR%%/silverbox-protocol.txt
51
%%DOCSDIR%%/box-protocol.txt
17
%%ETCDIR%%/tarantool.cfg
52
%%DOCSDIR%%/LICENSE
18
@dirrm %%DOCSDIR%%
53
@dirrm %%DOCSDIR%%
19
@dirrm %%ETCDIR%%
54
@dirrm include/tarantool
20
@dirrm bin/lib/yapps
21
@dirrm bin/lib

Return to bug 170348