]> git.saurik.com Git - redis.git/blame - src/rio.h
Fixed RESTORE hash failure (Issue #532)
[redis.git] / src / rio.h
CommitLineData
2e4b0e77
PN
1#ifndef __REDIS_RIO_H
2#define __REDIS_RIO_H
3
4#include <stdio.h>
b4b923b0 5#include <stdint.h>
2e4b0e77
PN
6#include "sds.h"
7
8struct _rio {
4c046297 9 /* Backend functions.
10 * Since this functions do not tolerate short writes or reads the return
11 * value is simplified to: zero on error, non zero on complete success. */
2e4b0e77
PN
12 size_t (*read)(struct _rio *, void *buf, size_t len);
13 size_t (*write)(struct _rio *, const void *buf, size_t len);
14 off_t (*tell)(struct _rio *);
b4b923b0 15 /* The update_cksum method if not NULL is used to compute the checksum of all the
16 * data that was read or written so far. The method should be designed so that
17 * can be called with the current checksum, and the buf and len fields pointing
18 * to the new block of data to add to the checksum computation. */
1bcb45d1 19 void (*update_cksum)(struct _rio *, const void *buf, size_t len);
b4b923b0 20
21 /* The current checksum */
22 uint64_t cksum;
2e4b0e77
PN
23
24 /* Backend-specific vars. */
25 union {
26 struct {
27 sds ptr;
28 off_t pos;
29 } buffer;
30 struct {
31 FILE *fp;
32 } file;
33 } io;
34};
35
36typedef struct _rio rio;
37
b4b923b0 38/* The following functions are our interface with the stream. They'll call the
39 * actual implementation of read / write / tell, and will update the checksum
40 * if needed. */
41
336ba6a1 42static inline size_t rioWrite(rio *r, const void *buf, size_t len) {
1bcb45d1 43 if (r->update_cksum) r->update_cksum(r,buf,len);
b4b923b0 44 return r->write(r,buf,len);
45}
46
336ba6a1 47static inline size_t rioRead(rio *r, void *buf, size_t len) {
b4b923b0 48 if (r->read(r,buf,len) == 1) {
1bcb45d1 49 if (r->update_cksum) r->update_cksum(r,buf,len);
b4b923b0 50 return 1;
51 }
52 return 0;
53}
54
336ba6a1 55static inline off_t rioTell(rio *r) {
b4b923b0 56 return r->tell(r);
57}
2e4b0e77 58
f96a8a80 59void rioInitWithFile(rio *r, FILE *fp);
60void rioInitWithBuffer(rio *r, sds s);
2e4b0e77
PN
61
62size_t rioWriteBulkCount(rio *r, char prefix, int count);
63size_t rioWriteBulkString(rio *r, const char *buf, size_t len);
64size_t rioWriteBulkLongLong(rio *r, long long l);
65size_t rioWriteBulkDouble(rio *r, double d);
66
b4b923b0 67void rioGenericUpdateChecksum(rio *r, const void *buf, size_t len);
68
2e4b0e77 69#endif