summaryrefslogtreecommitdiffstats
path: root/WebCore/storage/IDBObjectStoreBackendImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/storage/IDBObjectStoreBackendImpl.cpp')
-rw-r--r--[-rwxr-xr-x]WebCore/storage/IDBObjectStoreBackendImpl.cpp56
1 files changed, 3 insertions, 53 deletions
diff --git a/WebCore/storage/IDBObjectStoreBackendImpl.cpp b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
index 86237de..e5f81ab 100755..100644
--- a/WebCore/storage/IDBObjectStoreBackendImpl.cpp
+++ b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
@@ -279,64 +279,14 @@ void IDBObjectStoreBackendImpl::removeIndex(const String& name, PassRefPtr<IDBCa
callbacks->onSuccess();
}
-static String leftCursorWhereFragment(IDBKey::Type type, String comparisonOperator)
-{
- switch (type) {
- case IDBKey::StringType:
- return "? " + comparisonOperator + " keyString AND ";
- // FIXME: Implement date.
- case IDBKey::NumberType:
- return "(? " + comparisonOperator + " keyNumber OR NOT keyString IS NULL OR NOT keyDate IS NULL) AND ";
- case IDBKey::NullType:
- if (comparisonOperator == "<")
- return "NOT(keyString IS NULL AND keyDate IS NULL AND keyNumber IS NULL) AND ";
- return ""; // If it's =, the upper bound half will do the constraining. If it's <=, then that's a no-op.
- }
- ASSERT_NOT_REACHED();
- return "";
-}
-
-static String rightCursorWhereFragment(IDBKey::Type type, String comparisonOperator)
-{
- switch (type) {
- case IDBKey::StringType:
- return "(keyString " + comparisonOperator + " ? OR keyString IS NULL) AND ";
- // FIXME: Implement date.
- case IDBKey::NumberType:
- return "(keyNumber " + comparisonOperator + " ? OR keyNumber IS NULL) AND keyString IS NULL AND keyDate IS NULL AND ";
- case IDBKey::NullType:
- if (comparisonOperator == "<")
- return "0 != 0 AND ";
- return "keyString IS NULL AND keyDate IS NULL AND keyNumber IS NULL AND ";
- }
- ASSERT_NOT_REACHED();
- return "";
-}
-
void IDBObjectStoreBackendImpl::openCursor(PassRefPtr<IDBKeyRange> range, unsigned short tmpDirection, PassRefPtr<IDBCallbacks> callbacks)
{
- String lowerEquality;
- if (range->flags() & IDBKeyRange::LEFT_OPEN)
- lowerEquality = "<";
- else if (range->flags() & IDBKeyRange::LEFT_BOUND)
- lowerEquality = "<=";
- else
- lowerEquality = "=";
-
- String upperEquality;
- if (range->flags() & IDBKeyRange::RIGHT_OPEN)
- upperEquality = "<";
- else if (range->flags() & IDBKeyRange::RIGHT_BOUND)
- upperEquality = "<=";
- else
- upperEquality = "=";
-
- // If you change the order of this select, you'll need to change it in IDBCursorBackendImpl.cpp as well.
+ // Several files depend on this order of selects.
String sql = "SELECT id, keyString, keyDate, keyNumber, value FROM ObjectStoreData WHERE ";
if (range->flags() & IDBKeyRange::LEFT_BOUND || range->flags() == IDBKeyRange::SINGLE)
- sql += leftCursorWhereFragment(range->left()->type(), lowerEquality);
+ sql += range->left()->leftCursorWhereFragment(range->leftWhereClauseComparisonOperator());
if (range->flags() & IDBKeyRange::RIGHT_BOUND || range->flags() == IDBKeyRange::SINGLE)
- sql += rightCursorWhereFragment(range->right()->type(), upperEquality);
+ sql += range->right()->rightCursorWhereFragment(range->rightWhereClauseComparisonOperator());
sql += "objectStoreId = ? ORDER BY ";
IDBCursor::Direction direction = static_cast<IDBCursor::Direction>(tmpDirection);