Support the setting and getting of version information.

This commit is contained in:
Shawn Wilsher 2010-05-12 12:59:11 -07:00
parent 7318105b8e
commit 9aeb1b0a64
5 changed files with 195 additions and 22 deletions

View File

@ -93,6 +93,23 @@ private:
nsTArray<nsCOMPtr<nsISupports> > mDoomedObjects;
};
class SetVersionHelper : public AsyncConnectionHelper
{
public:
SetVersionHelper(IDBDatabaseRequest* aDatabase,
IDBRequest* aRequest,
const nsAString& aVersion)
: AsyncConnectionHelper(aDatabase, aRequest), mVersion(aVersion)
{ }
PRUint16 DoDatabaseWork(mozIStorageConnection* aConnection);
PRUint16 OnSuccess(nsIDOMEventTarget* aTarget);
private:
// In-params
nsString mVersion;
};
class CreateObjectStoreHelper : public AsyncConnectionHelper
{
public:
@ -377,6 +394,12 @@ IDBDatabaseRequest::FireCloseConnectionRunnable()
NS_ASSERTION(doomedObjects.Length() == 0, "Should have swapped!");
}
void
IDBDatabaseRequest::OnVersionSet(const nsString& aVersion)
{
mVersion = aVersion;
}
void
IDBDatabaseRequest::OnObjectStoreCreated(const nsAString& aName)
{
@ -478,7 +501,7 @@ IDBDatabaseRequest::GetIndexes(nsIDOMDOMStringList** aIndexes)
NS_ENSURE_TRUE(list->Add(mIndexNames[index]), NS_ERROR_OUT_OF_MEMORY);
}
list.forget(aIndexes);
return NS_OK;
}
@ -677,11 +700,15 @@ IDBDatabaseRequest::SetVersion(const nsAString& aVersion,
nsIIDBRequest** _retval)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
NS_NOTYETIMPLEMENTED("Implement me!");
nsCOMPtr<nsIIDBRequest> request(GenerateRequest());
nsRefPtr<IDBRequest> request = GenerateRequest();
nsRefPtr<SetVersionHelper> helper =
new SetVersionHelper(this, request, aVersion);
nsresult rv = helper->Dispatch(mConnectionThread);
NS_ENSURE_SUCCESS(rv, rv);
request.forget(_retval);
return NS_OK;
}
@ -717,6 +744,36 @@ IDBDatabaseRequest::Observe(nsISupports* aSubject,
return NS_OK;
}
PRUint16
SetVersionHelper::DoDatabaseWork(mozIStorageConnection* aConnection)
{
NS_PRECONDITION(aConnection, "Passing a null connection!");
nsCOMPtr<mozIStorageStatement> stmt;
nsresult rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE database "
"SET version = :version"
), getter_AddRefs(stmt));
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
rv = stmt->BindStringByName(NS_LITERAL_CSTRING("version"), mVersion);
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
if (NS_FAILED(stmt->Execute())) {
return nsIIDBDatabaseException::CONSTRAINT_ERR;
}
return OK;
}
PRUint16
SetVersionHelper::OnSuccess(nsIDOMEventTarget* aTarget)
{
mDatabase->OnVersionSet(mVersion);
return AsyncConnectionHelper::OnSuccess(aTarget);
}
PRUint16
CreateObjectStoreHelper::DoDatabaseWork(mozIStorageConnection* aConnection)
{

View File

@ -124,6 +124,7 @@ public:
void FireCloseConnectionRunnable();
void OnVersionSet(const nsString& aVersion);
void OnObjectStoreCreated(const nsAString& aName);
void OnIndexCreated(const nsAString& aName);
void OnObjectStoreRemoved(const nsAString& aName);

View File

@ -111,8 +111,7 @@ CreateTables(mozIStorageConnection* aDBConn)
"CREATE TABLE database ("
"name TEXT NOT NULL, "
"description TEXT NOT NULL, "
"version TEXT DEFAULT NULL, "
"UNIQUE (name)"
"version TEXT DEFAULT NULL"
");"
));
NS_ENSURE_SUCCESS(rv, rv);
@ -177,9 +176,33 @@ CreateTables(mozIStorageConnection* aDBConn)
return NS_OK;
}
nsresult
CreateMetaData(mozIStorageConnection* aConnection,
const nsAString& aName,
const nsAString& aDescription)
{
NS_PRECONDITION(!NS_IsMainThread(), "Wrong thread!");
NS_PRECONDITION(aConnection, "Null database!");
nsCOMPtr<mozIStorageStatement> stmt;
nsresult rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
"INSERT OR REPLACE INTO database (name, description) "
"VALUES (:name, :description)"
), getter_AddRefs(stmt));
NS_ENSURE_SUCCESS(rv, rv);
rv = stmt->BindStringByName(NS_LITERAL_CSTRING("name"), aName);
NS_ENSURE_SUCCESS(rv, rv);
rv = stmt->BindStringByName(NS_LITERAL_CSTRING("description"), aDescription);
NS_ENSURE_SUCCESS(rv, rv);
return stmt->Execute();
}
nsresult
CreateDatabaseConnection(const nsACString& aASCIIOrigin,
const nsAString& aName,
const nsAString& aDescription,
nsAString& aDatabaseFilePath,
mozIStorageConnection** aConnection)
{
@ -275,6 +298,9 @@ CreateDatabaseConnection(const nsACString& aASCIIOrigin,
rv = CreateTables(connection);
NS_ENSURE_SUCCESS(rv, rv);
rv = CreateMetaData(connection, aName, aDescription);
NS_ENSURE_SUCCESS(rv, rv);
}
#ifdef DEBUG
@ -419,28 +445,52 @@ OpenDatabaseHelper::DoDatabaseWork(mozIStorageConnection* aConnection)
#endif
NS_ASSERTION(!aConnection, "Huh?!");
nsresult rv = CreateDatabaseConnection(mASCIIOrigin, mName, mDatabaseFilePath,
nsresult rv = CreateDatabaseConnection(mASCIIOrigin, mName, mDescription,
mDatabaseFilePath,
getter_AddRefs(mConnection));
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
nsCOMPtr<mozIStorageStatement> stmt;
rv = mConnection->CreateStatement(NS_LITERAL_CSTRING(
"SELECT name "
"FROM object_store"
), getter_AddRefs(stmt));
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
PRBool hasResult;
while (NS_SUCCEEDED(stmt->ExecuteStep(&hasResult)) && hasResult) {
nsString* name = mObjectStoreNames.AppendElement();
NS_ENSURE_TRUE(name, nsIIDBDatabaseException::UNKNOWN_ERR);
rv = stmt->GetString(0, *name);
{ // Load object store names.
nsCOMPtr<mozIStorageStatement> stmt;
rv = mConnection->CreateStatement(NS_LITERAL_CSTRING(
"SELECT name "
"FROM object_store"
), getter_AddRefs(stmt));
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
PRBool hasResult;
while (NS_SUCCEEDED(stmt->ExecuteStep(&hasResult)) && hasResult) {
nsString* name = mObjectStoreNames.AppendElement();
NS_ENSURE_TRUE(name, nsIIDBDatabaseException::UNKNOWN_ERR);
rv = stmt->GetString(0, *name);
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
}
}
NS_WARNING("Need to load index names here!");
NS_WARNING("Need to load version here!");
{ // Load index names.
NS_WARNING("Need to load index names here!");
}
{ // Load version information.
nsCOMPtr<mozIStorageStatement> stmt;
rv = mConnection->CreateStatement(NS_LITERAL_CSTRING(
"SELECT version "
"FROM database"
), getter_AddRefs(stmt));
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
PRBool hasResult;
rv = stmt->ExecuteStep(&hasResult);
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
NS_ENSURE_TRUE(hasResult, nsIIDBDatabaseException::UNKNOWN_ERR);
rv = stmt->GetString(0, mVersion);
NS_ENSURE_SUCCESS(rv, nsIIDBDatabaseException::UNKNOWN_ERR);
if (mVersion.IsVoid()) {
mVersion.Assign(EmptyString());
}
}
return OK;
}

View File

@ -56,6 +56,7 @@ _TEST_FILES = \
test_objectStore_remove_values.html \
test_event_source.html \
test_objectStore_inline_autoincrement_key_added_on_put.html \
test_setVersion.html \
$(NULL)
libs:: $(_TEST_FILES)

View File

@ -0,0 +1,64 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html>
<head>
<title>Indexed Database Property Test</title>
<script type="text/javascript" src="/MochiKit/packed.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="helpers.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="text/javascript;version=1.7">
function testSteps()
{
const name = window.location.pathname;
const description = "My Test Database";
var request = indexedDB.open(name, description);
request.onerror = errorHandler;
request.onsuccess = continueTest;
var event = yield;
var db = event.result;
// Check default state.
SimpleTest.is(db.version, "", "Correct default version for a new database.");
const versions = [
"",
"1.0",
];
for (let i = 0; i < versions.length; i++) {
let version = versions[i];
let request = db.setVersion(version);
request.onerror = errorHandler;
request.onsuccess = continueTest;
event = yield;
SimpleTest.is(db.version, version,
"Database version number updated correctly");
}
SimpleTest.executeSoon(finishTest);
yield;
}
var gGen = testSteps();
function run_test()
{
SimpleTest.waitForExplicitFinish();
continueTest();
}
</script>
</head>
<body onload="run_test();">
</body>
</html>