/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ : * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
int rc = sqlite3_declare_vtab(aDB, virtualTableSchema); if (rc != SQLITE_OK) { return rc;
}
sqlite3_vtab* vt = new sqlite3_vtab();
memset(vt, 0, sizeof(*vt));
*aVtab = vt;
return SQLITE_OK;
}
int Disconnect(sqlite3_vtab* aVtab) { delete aVtab;
return SQLITE_OK;
}
int BestIndex(sqlite3_vtab* aVtab, sqlite3_index_info* aInfo) { // Here we specify what index constraints we want to handle. That is, there // might be some columns with particular constraints in which we can help // SQLite narrow down the result set. // // For example, take the "path = x" where x is a directory. In this case, // we can narrow our search to just this directory instead of the entire file // system. This can be a significant optimization. So, we want to handle that // constraint. To do so, we would look for two specific input conditions: // // 1. aInfo->aConstraint[i].iColumn == 1 // 2. aInfo->aConstraint[i].op == SQLITE_INDEX_CONSTRAINT_EQ // // The first states that the path column is being used in one of the input // constraints and the second states that the constraint involves the equal // operator. // // An even more specific search would be for name='xxx', in which case we // can limit the search to a single file, if it exists. // // What we have to do here is look for all of our index searches and select // the narrowest. We can only pick one, so obviously we want the one that // is the most specific, which leads to the smallest result set.
for (int i = 0; i < aInfo->nConstraint; i++) { if (aInfo->aConstraint[i].iColumn == 1 && aInfo->aConstraint[i].usable) { if (aInfo->aConstraint[i].op & SQLITE_INDEX_CONSTRAINT_EQ) {
aInfo->aConstraintUsage[i].argvIndex = 1;
} break;
}
// TODO: handle single files (constrained also by the name column)
}
return SQLITE_OK;
}
int Open(sqlite3_vtab* aVtab, sqlite3_vtab_cursor** aCursor) {
VirtualTableCursor* cursor = new VirtualTableCursor();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.