indexFstFile.h 2.7 KB
Newer Older
dengyihao's avatar
dengyihao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef __INDEX_FST_FILE_H__
#define __INDEX_FST_FILE_H__

#include "indexInt.h"

#ifdef __cplusplus
extern "C" {
#endif

//#define USE_MMAP 1

#define DefaultMem 1024 * 1024

static char tmpFile[] = "./index";
typedef enum WriterType { TMemory, TFile } WriterType;

typedef struct IFileCtx {
  int (*write)(struct IFileCtx* ctx, uint8_t* buf, int len);
  int (*read)(struct IFileCtx* ctx, uint8_t* buf, int len);
  int (*flush)(struct IFileCtx* ctx);
  int (*readFrom)(struct IFileCtx* ctx, uint8_t* buf, int len, int32_t offset);
  int (*size)(struct IFileCtx* ctx);
  WriterType type;
  union {
    struct {
      TdFilePtr pFile;
      bool      readOnly;
      char      buf[256];
dengyihao's avatar
dengyihao 已提交
44
      int64_t   size;
dengyihao's avatar
dengyihao 已提交
45 46 47 48 49
#ifdef USE_MMAP
      char* ptr;
#endif
    } file;
    struct {
dengyihao's avatar
dengyihao 已提交
50
      int32_t cap;
dengyihao's avatar
dengyihao 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
      char*   buf;
    } mem;
  };
  int32_t offset;
  int32_t limit;
} IFileCtx;

static int idxFileCtxDoWrite(IFileCtx* ctx, uint8_t* buf, int len);
static int idxFileCtxDoRead(IFileCtx* ctx, uint8_t* buf, int len);
static int idxFileCtxDoReadFrom(IFileCtx* ctx, uint8_t* buf, int len, int32_t offset);
static int idxFileCtxDoFlush(IFileCtx* ctx);

IFileCtx* idxFileCtxCreate(WriterType type, const char* path, bool readOnly, int32_t capacity);
void      idxFileCtxDestroy(IFileCtx* w, bool remove);

typedef uint32_t CheckSummer;

typedef struct IdxFstFile {
  void*       wrt;  // wrap any writer that counts and checksum bytes written
  uint64_t    count;
  CheckSummer summer;
} IdxFstFile;

int idxFileWrite(IdxFstFile* write, uint8_t* buf, uint32_t len);

int idxFileRead(IdxFstFile* write, uint8_t* buf, uint32_t len);

int idxFileFlush(IdxFstFile* write);

uint32_t idxFileMaskedCheckSum(IdxFstFile* write);

IdxFstFile* idxFileCreate(void* wtr);
void        idxFileDestroy(IdxFstFile* w);

void    idxFilePackUintIn(IdxFstFile* writer, uint64_t n, uint8_t nBytes);
uint8_t idxFilePackUint(IdxFstFile* writer, uint64_t n);

#define FST_WRITER_COUNT(writer)        (writer->count)
#define FST_WRITER_INTER_WRITER(writer) (writer->wtr)
#define FST_WRITE_CHECK_SUMMER(writer)  (writer->summer)

#ifdef __cplusplus
}
#endif

#endif