Save a Redis object. * Returns -1 on error, number of bytes written on success. */
| 820 | /* Save a Redis object. |
| 821 | * Returns -1 on error, number of bytes written on success. */ |
| 822 | ssize_t rdbSaveObject(rio *rdb, robj_roptr o, robj_roptr key) { |
| 823 | ssize_t n = 0, nwritten = 0; |
| 824 | |
| 825 | if (o->type == OBJ_STRING) { |
| 826 | /* Save a string value */ |
| 827 | if ((n = rdbSaveStringObject(rdb,o)) == -1) return -1; |
| 828 | nwritten += n; |
| 829 | } else if (o->type == OBJ_LIST) { |
| 830 | /* Save a list value */ |
| 831 | if (o->encoding == OBJ_ENCODING_QUICKLIST) { |
| 832 | quicklist *ql = (quicklist*)ptrFromObj(o); |
| 833 | quicklistNode *node = ql->head; |
| 834 | |
| 835 | if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1; |
| 836 | nwritten += n; |
| 837 | |
| 838 | while(node) { |
| 839 | if (quicklistNodeIsCompressed(node)) { |
| 840 | void *data; |
| 841 | size_t compress_len = quicklistGetLzf(node, &data); |
| 842 | if ((n = rdbSaveLzfBlob(rdb,data,compress_len,node->sz)) == -1) return -1; |
| 843 | nwritten += n; |
| 844 | } else { |
| 845 | if ((n = rdbSaveRawString(rdb,node->zl,node->sz)) == -1) return -1; |
| 846 | nwritten += n; |
| 847 | } |
| 848 | node = node->next; |
| 849 | } |
| 850 | } else { |
| 851 | serverPanic("Unknown list encoding"); |
| 852 | } |
| 853 | } else if (o->type == OBJ_SET) { |
| 854 | /* Save a set value */ |
| 855 | if (o->encoding == OBJ_ENCODING_HT) { |
| 856 | dict *set = (dict*)ptrFromObj(o); |
| 857 | dictIterator *di = dictGetIterator(set); |
| 858 | dictEntry *de; |
| 859 | |
| 860 | if ((n = rdbSaveLen(rdb,dictSize(set))) == -1) { |
| 861 | dictReleaseIterator(di); |
| 862 | return -1; |
| 863 | } |
| 864 | nwritten += n; |
| 865 | |
| 866 | while((de = dictNext(di)) != NULL) { |
| 867 | sds ele = (sds)dictGetKey(de); |
| 868 | if ((n = rdbSaveRawString(rdb,(unsigned char*)ele,sdslen(ele))) |
| 869 | == -1) |
| 870 | { |
| 871 | dictReleaseIterator(di); |
| 872 | return -1; |
| 873 | } |
| 874 | nwritten += n; |
| 875 | } |
| 876 | dictReleaseIterator(di); |
| 877 | } else if (o->encoding == OBJ_ENCODING_INTSET) { |
| 878 | size_t l = intsetBlobLen((intset*)ptrFromObj(o)); |
| 879 |
no test coverage detected