hirlite 0.0.2.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +13 -5
  2. data/ext/hirlite_ext/hirlite_ext.h +1 -1
  3. data/ext/hirlite_ext/rlite.c +3 -23
  4. data/lib/hirlite/connection.rb +4 -0
  5. data/lib/hirlite/version.rb +1 -1
  6. data/vendor/rlite/deps/lua/src/lua_cjson.c +1 -1
  7. data/vendor/rlite/src/Makefile +12 -25
  8. data/vendor/rlite/src/dump.c +3 -3
  9. data/vendor/rlite/src/flock_posix.c +79 -0
  10. data/vendor/rlite/src/flock_win.c +6 -0
  11. data/vendor/rlite/src/hirlite.c +265 -25
  12. data/vendor/rlite/src/hyperloglog.c +1 -1
  13. data/vendor/rlite/src/lzf_c.c +1 -1
  14. data/vendor/rlite/src/lzf_d.c +1 -1
  15. data/vendor/rlite/src/page_btree.c +3 -3
  16. data/vendor/rlite/src/page_key.c +12 -13
  17. data/vendor/rlite/src/page_list.c +4 -4
  18. data/vendor/rlite/src/page_long.c +2 -2
  19. data/vendor/rlite/src/page_multi_string.c +5 -5
  20. data/vendor/rlite/src/page_skiplist.c +3 -3
  21. data/vendor/rlite/src/page_string.c +2 -2
  22. data/vendor/rlite/src/pubsub.c +448 -0
  23. data/vendor/rlite/src/restore.c +5 -5
  24. data/vendor/rlite/src/rlite.c +141 -146
  25. data/vendor/rlite/src/rlite.h +40 -12
  26. data/vendor/rlite/src/{constants.h → rlite/constants.h} +0 -0
  27. data/vendor/rlite/src/{crc64.h → rlite/crc64.h} +0 -0
  28. data/vendor/rlite/src/{dump.h → rlite/dump.h} +0 -0
  29. data/vendor/rlite/src/{endianconv.h → rlite/endianconv.h} +0 -0
  30. data/vendor/rlite/src/rlite/flock.h +8 -0
  31. data/vendor/rlite/src/{hirlite.h → rlite/hirlite.h} +1 -0
  32. data/vendor/rlite/src/{hyperloglog.h → rlite/hyperloglog.h} +0 -0
  33. data/vendor/rlite/src/{lzf.h → rlite/lzf.h} +0 -0
  34. data/vendor/rlite/src/{lzfP.h → rlite/lzfP.h} +0 -0
  35. data/vendor/rlite/src/{page_btree.h → rlite/page_btree.h} +0 -0
  36. data/vendor/rlite/src/{page_key.h → rlite/page_key.h} +0 -0
  37. data/vendor/rlite/src/{page_list.h → rlite/page_list.h} +0 -0
  38. data/vendor/rlite/src/{page_long.h → rlite/page_long.h} +0 -0
  39. data/vendor/rlite/src/{page_multi_string.h → rlite/page_multi_string.h} +0 -0
  40. data/vendor/rlite/src/{page_skiplist.h → rlite/page_skiplist.h} +0 -0
  41. data/vendor/rlite/src/{page_string.h → rlite/page_string.h} +0 -0
  42. data/vendor/rlite/src/{pqsort.h → rlite/pqsort.h} +0 -0
  43. data/vendor/rlite/src/rlite/pubsub.h +25 -0
  44. data/vendor/rlite/src/{rand.h → rlite/rand.h} +0 -0
  45. data/vendor/rlite/src/{restore.h → rlite/restore.h} +0 -0
  46. data/vendor/rlite/src/{scripting.h → rlite/scripting.h} +0 -0
  47. data/vendor/rlite/src/{sha1.h → rlite/sha1.h} +0 -0
  48. data/vendor/rlite/src/rlite/signal.h +11 -0
  49. data/vendor/rlite/src/{solarisfixes.h → rlite/solarisfixes.h} +0 -0
  50. data/vendor/rlite/src/{sort.h → rlite/sort.h} +0 -0
  51. data/vendor/rlite/src/{status.h → rlite/status.h} +1 -0
  52. data/vendor/rlite/src/{type_hash.h → rlite/type_hash.h} +0 -0
  53. data/vendor/rlite/src/{type_list.h → rlite/type_list.h} +0 -0
  54. data/vendor/rlite/src/{type_set.h → rlite/type_set.h} +0 -0
  55. data/vendor/rlite/src/{type_string.h → rlite/type_string.h} +0 -0
  56. data/vendor/rlite/src/{type_zset.h → rlite/type_zset.h} +0 -0
  57. data/vendor/rlite/src/{util.h → rlite/util.h} +2 -1
  58. data/vendor/rlite/src/{utilfromredis.h → rlite/utilfromredis.h} +0 -0
  59. data/vendor/rlite/src/rlite/wal.h +8 -0
  60. data/vendor/rlite/src/scripting.c +8 -10
  61. data/vendor/rlite/src/sha1.c +2 -2
  62. data/vendor/rlite/src/signal_posix.c +118 -0
  63. data/vendor/rlite/src/signal_win.c +17 -0
  64. data/vendor/rlite/src/sort.c +2 -2
  65. data/vendor/rlite/src/type_hash.c +4 -4
  66. data/vendor/rlite/src/type_list.c +4 -4
  67. data/vendor/rlite/src/type_set.c +4 -4
  68. data/vendor/rlite/src/type_string.c +4 -4
  69. data/vendor/rlite/src/type_zset.c +7 -7
  70. data/vendor/rlite/src/util.c +28 -5
  71. data/vendor/rlite/src/utilfromredis.c +1 -1
  72. data/vendor/rlite/src/wal.c +309 -0
  73. metadata +59 -35
@@ -2,18 +2,18 @@
2
2
  #define _RLITE_H
3
3
 
4
4
  #include <stdio.h>
5
- #include "status.h"
6
- #include "page_btree.h"
7
- #include "page_key.h"
8
- #include "type_hash.h"
9
- #include "type_zset.h"
10
- #include "type_set.h"
11
- #include "type_list.h"
12
- #include "type_string.h"
13
- #include "sort.h"
14
- #include "restore.h"
15
- #include "dump.h"
16
- #include "util.h"
5
+ #include "rlite/status.h"
6
+ #include "rlite/page_btree.h"
7
+ #include "rlite/page_key.h"
8
+ #include "rlite/type_hash.h"
9
+ #include "rlite/type_zset.h"
10
+ #include "rlite/type_set.h"
11
+ #include "rlite/type_list.h"
12
+ #include "rlite/type_string.h"
13
+ #include "rlite/sort.h"
14
+ #include "rlite/restore.h"
15
+ #include "rlite/dump.h"
16
+ #include "rlite/util.h"
17
17
 
18
18
  #define REDIS_RDB_VERSION 6
19
19
 
@@ -50,6 +50,24 @@
50
50
  #define RLITE_OPEN_READWRITE 0x00000002
51
51
  #define RLITE_OPEN_CREATE 0x00000004
52
52
 
53
+ #define RLITE_FLOCK_SH 1
54
+ #define RLITE_FLOCK_EX 2
55
+ #define RLITE_FLOCK_UN 3
56
+
57
+ #define RLITE_INTERNAL_DB_COUNT 6
58
+ #define RLITE_INTERNAL_DB_NO 0
59
+ #define RLITE_INTERNAL_DB_LUA 1
60
+ // the following two databases might look confusing, bear with me
61
+ // subscriber->channels map a subscriber_id to a set of channels it is subscribed
62
+ // channel->subscribers maps a channel to the subscribers id
63
+ // any operation on one of them should keep the other one in sync
64
+ // same premise applies to patterns instead of channels
65
+ #define RLITE_INTERNAL_DB_SUBSCRIBER_CHANNELS 2
66
+ #define RLITE_INTERNAL_DB_CHANNEL_SUBSCRIBERS 3
67
+ #define RLITE_INTERNAL_DB_SUBSCRIBER_PATTERNS 4
68
+ #define RLITE_INTERNAL_DB_PATTERN_SUBSCRIBERS 5
69
+ #define RLITE_INTERNAL_DB_SUBSCRIBER_MESSAGES 6
70
+
53
71
  struct rlite;
54
72
  struct rl_btree;
55
73
 
@@ -93,6 +111,7 @@ typedef struct rlite {
93
111
  long page_size;
94
112
  void *driver;
95
113
  int driver_type;
114
+ int selected_internal;
96
115
  int selected_database;
97
116
  int number_of_databases;
98
117
  long *databases;
@@ -102,6 +121,10 @@ typedef struct rlite {
102
121
  long write_pages_alloc;
103
122
  long write_pages_len;
104
123
  rl_page **write_pages;
124
+
125
+ char *subscriber_id;
126
+ char *subscriber_lock_filename;
127
+ FILE *subscriber_lock_fp;
105
128
  } rlite;
106
129
 
107
130
  typedef struct watched_key {
@@ -111,9 +134,12 @@ typedef struct watched_key {
111
134
  } watched_key;
112
135
 
113
136
  int rl_open(const char *filename, rlite **db, int flags);
137
+ int rl_refresh(rlite *db);
114
138
  int rl_close(rlite *db);
115
139
 
140
+ int rl_ensure_pages(rlite *db);
116
141
  int rl_read_header(rlite *db);
142
+ int rl_header_deserialize(struct rlite *db, void **obj, void *context, unsigned char *data);
117
143
  int rl_read(struct rlite *db, rl_data_type *type, long page, void *context, void **obj, int cache);
118
144
  int rl_get_key_btree(rlite *db, struct rl_btree **btree, int create);
119
145
  int rl_alloc_page_number(rlite *db, long *page_number);
@@ -124,7 +150,9 @@ int rl_dirty_hash(struct rlite *db, unsigned char **hash);
124
150
  int rl_commit(struct rlite *db);
125
151
  int rl_discard(struct rlite *db);
126
152
  int rl_is_balanced(struct rlite *db);
153
+ int rl_get_selected_db(struct rlite *db);
127
154
  int rl_select(struct rlite *db, int selected_database);
155
+ int rl_select_internal(struct rlite *db, int internal);
128
156
  int rl_move(struct rlite *db, unsigned char *key, long keylen, int database);
129
157
  int rl_rename(struct rlite *db, const unsigned char *src, long srclen, const unsigned char *target, long targetlen, int overwrite);
130
158
  int rl_dbsize(struct rlite *db, long *size);
@@ -0,0 +1,8 @@
1
+ #ifndef _RL_FLOCK_H
2
+ #define _RL_FLOCK_H
3
+ #include <stdio.h>
4
+
5
+ int rl_flock(FILE *fp, int type);
6
+ int rl_is_flocked(const char *path, int type);
7
+
8
+ #endif
@@ -107,6 +107,7 @@ struct rliteClient;
107
107
  typedef struct rliteContext {
108
108
  int err; /* Error flags, 0 when there is no error */
109
109
  char errstr[128]; /* String representation of error when applicable */
110
+ char *path;
110
111
  rliteReply **replies;
111
112
  int replyPosition; // avoid reallocing the pointer after removing an element, keep a reference of the next position
112
113
  int replyLength;
File without changes
@@ -0,0 +1,25 @@
1
+ #ifndef _RL_PUBSUB_H
2
+ #define _RL_PUBSUB_H
3
+
4
+ #include <sys/time.h>
5
+ #include "rlite.h"
6
+
7
+ int rl_subscribe(rlite *db, int channelc, unsigned char **channelv, long *channelvlen);
8
+ int rl_psubscribe(rlite *db, int patternc, unsigned char **patternv, long *patternvlen);
9
+ int rl_unsubscribe(rlite *db, int channelc, unsigned char **channelv, long *channelvlen);
10
+ int rl_punsubscribe(rlite *db, int patternc, unsigned char **patternv, long *patternvlen);
11
+ int rl_unsubscribe_all(rlite *db);
12
+ int rl_poll(rlite *db, int *elementc, unsigned char ***_elements, long **_elementslen);
13
+ /**
14
+ * When timeout is NULL, it will wait for ever.
15
+ */
16
+ int rl_poll_wait(rlite *db, int *elementc, unsigned char ***_elements, long **_elementslen, struct timeval *timeout);
17
+ int rl_publish(rlite *db, unsigned char *channel, size_t channellen, const char *data, size_t datalen, long *recipients);
18
+
19
+ int rl_pubsub_count_subscriptions(rlite *db, long *numsubscriptions);
20
+ int rl_pubsub_channels(rlite *db, unsigned char *pattern, long patternlen, long* channelc, unsigned char ***channelv, long **channelvlen);
21
+ int rl_pubsub_patterns(rlite *db, long* patternc, unsigned char ***patternv, long **patternvlen);
22
+ int rl_pubsub_numsub(rlite *db, int channelc, unsigned char **channelv, long *channelvlen, long *numsub);
23
+ int rl_pubsub_numpat(rlite *db, long *numpat);
24
+
25
+ #endif
@@ -0,0 +1,11 @@
1
+ #ifndef _RL_FIFO_H
2
+ #define _RL_FIFO_H
3
+
4
+ #include <sys/time.h>
5
+
6
+ int rl_create_signal(const char *signal_name);
7
+ int rl_delete_signal(const char *signal_name);
8
+ int rl_read_signal(const char *signal_name, struct timeval *timeout, char **_data, size_t *_datalen);
9
+ int rl_write_signal(const char *signal_name, const char *data, size_t datalen);
10
+
11
+ #endif
@@ -15,5 +15,6 @@
15
15
  #define RL_NAN 11
16
16
  #define RL_OVERFLOW 12
17
17
  #define RL_OUTDATED 13
18
+ #define RL_TIMEOUT 14
18
19
 
19
20
  #endif
@@ -59,13 +59,14 @@ int sha1_cmp(void *v1, void *v2);
59
59
  int double_cmp(void *v1, void *v2);
60
60
  #ifdef RL_DEBUG
61
61
  int long_formatter(void *v2, char **formatted, int *size);
62
- int sha1_formatter(void *v2, char **formatted, int *size);
63
62
  int double_formatter(void *v2, char **formatted, int *size);
64
63
  #endif
64
+ int sha1_formatter(void *v2, char **formatted, int *size);
65
65
  double get_double(const unsigned char *p);
66
66
  void put_double(unsigned char *p, double v);
67
67
  int sha1(const unsigned char *data, long datalen, unsigned char digest[20]);
68
68
  unsigned long long rl_mstime();
69
69
  double rl_strtod(unsigned char *str, long strlen, unsigned char **eptr);
70
+ char *rl_get_filename_with_suffix(const char *filename, char *suffix);
70
71
 
71
72
  #endif
@@ -0,0 +1,8 @@
1
+ #ifndef _RL_WAL_H
2
+ #define _RL_WAL_H
3
+
4
+ int rl_write_apply_wal(rlite *db);
5
+ int rl_write_wal(const char *wal_path, rlite *db, unsigned char **_data, size_t *_datalen);
6
+ int rl_apply_wal(rlite *db);
7
+
8
+ #endif
@@ -29,10 +29,10 @@
29
29
  */
30
30
 
31
31
  #include "rlite.h"
32
- #include "hirlite.h"
33
- #include "sha1.h"
34
- #include "rand.h"
35
- #include "constants.h"
32
+ #include "rlite/hirlite.h"
33
+ #include "rlite/sha1.h"
34
+ #include "rlite/rand.h"
35
+ #include "rlite/constants.h"
36
36
 
37
37
  #include <lua.h>
38
38
  #include <lauxlib.h>
@@ -52,25 +52,23 @@ static int setScript(rliteClient *c, char *script, long scriptlen) {
52
52
  int retval;
53
53
  char hash[40];
54
54
  sha1hex(hash, script, scriptlen);
55
- int selected_database = c->context->db->selected_database;
56
- c->context->db->selected_database = c->context->db->number_of_databases;
55
+ RL_CALL(rl_select_internal, RL_OK, c->context->db, RLITE_INTERNAL_DB_LUA);
57
56
 
58
57
  RL_CALL(rl_set, RL_OK, c->context->db, (unsigned char *)hash, 40, (unsigned char *)script, scriptlen, 0, 0);
59
58
 
60
59
  cleanup:
61
- c->context->db->selected_database = selected_database;
60
+ rl_select_internal(c->context->db, RLITE_INTERNAL_DB_NO);
62
61
  return retval;
63
62
  }
64
63
 
65
64
  static int getScript(rliteClient *c, char hash[40], char **script, long *scriptlen) {
66
65
  int retval;
67
- int selected_database = c->context->db->selected_database;
68
- c->context->db->selected_database = c->context->db->number_of_databases;
66
+ RL_CALL(rl_select_internal, RL_OK, c->context->db, RLITE_INTERNAL_DB_LUA);
69
67
 
70
68
  RL_CALL(rl_get, RL_OK, c->context->db, (unsigned char *)hash, 40, (unsigned char **)script, scriptlen);
71
69
 
72
70
  cleanup:
73
- c->context->db->selected_database = selected_database;
71
+ rl_select_internal(c->context->db, RLITE_INTERNAL_DB_NO);
74
72
  return retval;
75
73
  }
76
74
 
@@ -25,9 +25,9 @@ A million repetitions of "a"
25
25
  #include <string.h>
26
26
  #include <sys/types.h> /* for u_int*_t */
27
27
  #if defined(__sun)
28
- #include "solarisfixes.h"
28
+ #include "rlite/solarisfixes.h"
29
29
  #endif
30
- #include "sha1.h"
30
+ #include "rlite/sha1.h"
31
31
 
32
32
  #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
33
33
 
@@ -0,0 +1,118 @@
1
+ #include <fcntl.h>
2
+ #include <stdlib.h>
3
+ #include <string.h>
4
+ #include <stdio.h>
5
+ #include <sys/types.h>
6
+ #include <sys/select.h>
7
+ #include <sys/stat.h>
8
+ #include <unistd.h>
9
+ #include "rlite.h"
10
+ #include "rlite/util.h"
11
+ #include "rlite/crc64.h"
12
+ #include "rlite/endianconv.h"
13
+
14
+ // header is 4-bytes size and 8-bytes crc
15
+ #define FIFO_HEADER_SIZE 12
16
+
17
+ int rl_create_signal(const char *signal_name) {
18
+ return mkfifo(signal_name, 0777) == 0 ? RL_OK : RL_UNEXPECTED;
19
+ }
20
+
21
+ int rl_delete_signal(const char *signal_name) {
22
+ unlink(signal_name);
23
+ return RL_OK;
24
+ }
25
+
26
+ int rl_read_signal(const char *signal_name, struct timeval *timeout, char **_data, size_t *_datalen)
27
+ {
28
+ char header[FIFO_HEADER_SIZE];
29
+ uint64_t crc;
30
+ size_t readbytes;
31
+ size_t datalen;
32
+ int fd;
33
+ int retval;
34
+ char *data = NULL;
35
+ fd_set rfds;
36
+ int oflag = O_RDONLY;
37
+
38
+ if (timeout) {
39
+ // select will block, we don't want open to block
40
+ oflag |= O_NONBLOCK;
41
+ }
42
+
43
+ fd = open(signal_name, oflag);
44
+ if (fd == -1) {
45
+ retval = RL_UNEXPECTED;
46
+ goto cleanup;
47
+ }
48
+
49
+ if (timeout) {
50
+ FD_ZERO(&rfds);
51
+ FD_SET(fd, &rfds);
52
+ retval = select(fd + 1, &rfds, NULL, NULL, timeout);
53
+ if (retval == -1) {
54
+ retval = RL_UNEXPECTED;
55
+ goto cleanup;
56
+ } else if (retval != 0) {
57
+ retval = RL_TIMEOUT;
58
+ goto cleanup;
59
+ }
60
+ }
61
+
62
+ readbytes = read(fd, header, FIFO_HEADER_SIZE);
63
+ if (readbytes != FIFO_HEADER_SIZE) {
64
+ retval = RL_UNEXPECTED;
65
+ goto cleanup;
66
+ }
67
+
68
+ datalen = (size_t)get_4bytes((unsigned char *)header);
69
+ RL_MALLOC(data, sizeof(char) * datalen);
70
+
71
+ readbytes = read(fd, data, datalen);
72
+ if (readbytes != datalen) {
73
+ retval = RL_UNEXPECTED;
74
+ goto cleanup;
75
+ }
76
+ crc = rl_crc64(0, (unsigned char *)data, datalen);
77
+ memrev64ifbe(&crc);
78
+ memcpy(&header[4], &crc, 8);
79
+ if (memcmp(&crc, &header[4], 8) != 0) {
80
+ retval = RL_UNEXPECTED;
81
+ goto cleanup;
82
+ }
83
+ if (_data) {
84
+ *_data = data;
85
+ }
86
+ if (_datalen) {
87
+ *_datalen = datalen;
88
+ }
89
+ retval = RL_OK;
90
+ cleanup:
91
+ if (fd >= 0) {
92
+ close(fd);
93
+ }
94
+ if (retval != RL_OK || _data == NULL) {
95
+ rl_free(data);
96
+ }
97
+ return retval;
98
+ }
99
+
100
+ int rl_write_signal(const char *signal_name, const char *data, size_t datalen) {
101
+ char header[FIFO_HEADER_SIZE];
102
+ put_4bytes((unsigned char *)header, datalen);
103
+
104
+ uint64_t crc = rl_crc64(0, (unsigned char *)data, datalen);
105
+ memrev64ifbe(&crc);
106
+ memcpy(&header[4], &crc, 8);
107
+
108
+ int fd = open(signal_name, O_WRONLY | O_NONBLOCK);
109
+ if (fd == -1) {
110
+ // fifo may not always exist on our code
111
+ // it is a way to signal between processes, but it is show and forget
112
+ return RL_OK;
113
+ }
114
+ write(fd, header, FIFO_HEADER_SIZE);
115
+ write(fd, data, datalen);
116
+ close(fd);
117
+ return RL_OK;
118
+ }
@@ -0,0 +1,17 @@
1
+ #include "rlite.h"
2
+
3
+ int rl_create_signal(const char *signal_name) {
4
+ return RL_NOT_IMPLEMENTED;
5
+ }
6
+
7
+ int rl_delete_signal(const char *signal_name) {
8
+ return RL_NOT_IMPLEMENTED;
9
+ }
10
+
11
+ int rl_read_signal(const char *signal_name, char **_data, size_t *_datalen) {
12
+ return RL_NOT_IMPLEMENTED;
13
+ }
14
+
15
+ int rl_write_signal(const char *signal_name, const char *data, size_t datalen) {
16
+ return RL_NOT_IMPLEMENTED;
17
+ }
@@ -30,8 +30,8 @@
30
30
 
31
31
 
32
32
  #include "rlite.h"
33
- #include "sort.h"
34
- #include "pqsort.h" /* Partial qsort for SORT+LIMIT */
33
+ #include "rlite/sort.h"
34
+ #include "rlite/pqsort.h" /* Partial qsort for SORT+LIMIT */
35
35
  #include <math.h> /* isnan() */
36
36
  #include <errno.h>
37
37