sqliterk_pager.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * Tencent is pleased to support the open source community by making
  3. * WCDB available.
  4. *
  5. * Copyright (C) 2017 THL A29 Limited, a Tencent company.
  6. * All rights reserved.
  7. *
  8. * Licensed under the BSD 3-Clause License (the "License"); you may not use
  9. * this file except in compliance with the License. You may obtain a copy of
  10. * the License at
  11. *
  12. * https://opensource.org/licenses/BSD-3-Clause
  13. *
  14. * Unless required by applicable law or agreed to in writing, software
  15. * distributed under the License is distributed on an "AS IS" BASIS,
  16. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. */
  20. #ifndef sqliterk_pager_h
  21. #define sqliterk_pager_h
  22. #include "sqliterk_crypto.h"
  23. #include <stdio.h>
  24. // A legal state transfer is:
  25. // unchecked --> checking
  26. // checking --> invalid
  27. // checking --> damaged
  28. // checking --> checked
  29. // checking --> discarded
  30. // default status is unchecked
  31. typedef enum {
  32. sqliterk_status_invalid = -1,
  33. sqliterk_status_unchecked = 0,
  34. sqliterk_status_checking = 1,
  35. sqliterk_status_damaged = 2,
  36. sqliterk_status_discarded = 3,
  37. sqliterk_status_checked = 4,
  38. } sqliterk_status;
  39. // We are only concerned about the listed types. See https://www.sqlite.org/fileformat2.html#btree
  40. typedef enum {
  41. sqliterk_page_type_interior_index = 2,
  42. sqliterk_page_type_interior_table = 5,
  43. sqliterk_page_type_leaf_index = 10,
  44. sqliterk_page_type_leaf_table = 13,
  45. sqliterk_page_type_overflow = 1,
  46. sqliterk_page_type_unknown = -1,
  47. } sqliterk_page_type;
  48. // sqliterk_pager is the management class for all page in single db file
  49. typedef struct sqliterk_pager sqliterk_pager;
  50. // sqliterk_page is single page in db file, including its page data. But sometime, page data will be ahead release to save memory.
  51. typedef struct sqliterk_page sqliterk_page;
  52. typedef struct sqliterk_file sqliterk_file;
  53. typedef struct sqliterk_cipher_conf sqliterk_cipher_conf;
  54. struct sqliterk_pager {
  55. sqliterk_file *file;
  56. sqliterk_status *pagesStatus;
  57. int pagesize;
  58. int freepagecount;
  59. int reservedBytes;
  60. int pagecount;
  61. int usableSize; // pagesize-reservedBytes
  62. unsigned int integrity; // integrity flags.
  63. sqliterk_codec *codec; // Codec context, implemented in SQLCipher library.
  64. };
  65. int sqliterkPagerOpen(const char *path,
  66. const sqliterk_cipher_conf *cipher,
  67. sqliterk_pager **pager);
  68. int sqliterkPagerClose(sqliterk_pager *pager);
  69. int sqliterkPagerGetPageCount(sqliterk_pager *pager);
  70. int sqliterkPagerIsPagenoValid(sqliterk_pager *pager, int pageno);
  71. int sqliterkPagerGetSize(sqliterk_pager *pager);
  72. int sqliterkPagerGetUsableSize(sqliterk_pager *pager);
  73. void sqliterkPagerSetStatus(sqliterk_pager *pager,
  74. int pageno,
  75. sqliterk_status status);
  76. sqliterk_status sqliterkPagerGetStatus(sqliterk_pager *pager, int pageno);
  77. int sqliterkPagerGetParsedPageCount(sqliterk_pager *pager);
  78. int sqliterkPagerGetValidPageCount(sqliterk_pager *pager);
  79. unsigned int sqliterkPagerGetIntegrity(sqliterk_pager *pager);
  80. int sqliterkPageAcquire(sqliterk_pager *pager,
  81. int pageno,
  82. sqliterk_page **page);
  83. int sqliterkPageAcquireOverflow(sqliterk_pager *pager,
  84. int pageno,
  85. sqliterk_page **page);
  86. int sqliterkPageAcquireType(sqliterk_pager *pager,
  87. int pageno,
  88. sqliterk_page_type *type);
  89. int sqliterkPageClearData(sqliterk_page *page);
  90. int sqliterkPageRelease(sqliterk_page *page);
  91. int sqliterkPagenoHeaderOffset(int pageno);
  92. int sqliterkPageHeaderOffset(sqliterk_page *page);
  93. const unsigned char *sqliterkPageGetData(sqliterk_page *page);
  94. int sqliterkPageGetPageno(sqliterk_page *page);
  95. sqliterk_page_type sqliterkPageGetType(sqliterk_page *page);
  96. const char *sqliterkPageGetTypeName(sqliterk_page_type type);
  97. #endif /* sqliterk_pager_h */