| 914 | } |
| 915 | } |
| 916 | void fastClear(KeyRangeRef keys, bool& freeTableEmpty) { |
| 917 | std::vector<int> clearBuffer(SERVER_KNOBS->CLEAR_BUFFER_SIZE); |
| 918 | clearBuffer[0] = 0; |
| 919 | |
| 920 | while (true) { |
| 921 | if (moveTo(keys.begin) < 0) |
| 922 | moveNext(); |
| 923 | RawCursor endCursor(db, db.table, false); |
| 924 | if (endCursor.moveTo(keys.end) >= 0) |
| 925 | endCursor.movePrevious(); |
| 926 | |
| 927 | if (!valid || !endCursor || |
| 928 | (db.fragment_values ? (decodeKVFragment(getEncodedRow()).get().key >= |
| 929 | decodeKVFragment(endCursor.getEncodedRow()).get().key) |
| 930 | : (decodeKV(getEncodedRow()).key > decodeKV(endCursor.getEncodedRow()).key))) |
| 931 | break; // If empty stop! |
| 932 | |
| 933 | int rc = sqlite3BtreeDeleteRange( |
| 934 | cursor, endCursor.cursor, &clearBuffer[0], &clearBuffer[0] + clearBuffer.size()); |
| 935 | if (rc == 201) |
| 936 | continue; |
| 937 | if (!rc) |
| 938 | break; |
| 939 | db.checkError("BtreeDeleteRange", rc); |
| 940 | } |
| 941 | |
| 942 | if (clearBuffer[0]) { |
| 943 | // printf("fastClear(%s,%s): %d pages freed\n", printable(keys.begin).c_str(), printable(keys.end).c_str(), |
| 944 | // clearBuffer[0]); |
| 945 | IntKeyCursor fc(db, db.freetable, true); |
| 946 | int pagesDeleted = 0; |
| 947 | db.checkError("BtreeLazyDelete", |
| 948 | sqlite3BtreeLazyDelete( |
| 949 | fc.cursor, &clearBuffer[0], &clearBuffer[0] + clearBuffer.size(), 0, &pagesDeleted)); |
| 950 | ASSERT(pagesDeleted == 0); |
| 951 | freeTableEmpty = false; |
| 952 | } |
| 953 | } |
| 954 | int lazyDelete(int desiredPages) { |
| 955 | std::vector<int> clearBuffer(SERVER_KNOBS->CLEAR_BUFFER_SIZE); |
| 956 | clearBuffer[0] = 0; |
no test coverage detected