]> git.saurik.com Git - redis.git/blame_incremental - src/rio.h
SHUTDOWN NOSAVE now can stop a non returning script. Issue #466.
[redis.git] / src / rio.h
... / ...
CommitLineData
1#ifndef __REDIS_RIO_H
2#define __REDIS_RIO_H
3
4#include <stdio.h>
5#include <stdint.h>
6#include "sds.h"
7
8struct _rio {
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. */
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 *);
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. */
19 void (*update_cksum)(struct _rio *, const void *buf, size_t len);
20
21 /* The current checksum */
22 uint64_t cksum;
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
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
42static inline size_t rioWrite(rio *r, const void *buf, size_t len) {
43 if (r->update_cksum) r->update_cksum(r,buf,len);
44 return r->write(r,buf,len);
45}
46
47static inline size_t rioRead(rio *r, void *buf, size_t len) {
48 if (r->read(r,buf,len) == 1) {
49 if (r->update_cksum) r->update_cksum(r,buf,len);
50 return 1;
51 }
52 return 0;
53}
54
55static inline off_t rioTell(rio *r) {
56 return r->tell(r);
57}
58
59void rioInitWithFile(rio *r, FILE *fp);
60void rioInitWithBuffer(rio *r, sds s);
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
67void rioGenericUpdateChecksum(rio *r, const void *buf, size_t len);
68
69#endif