abergmeier
abergmeier

Reputation: 14072

InvalidStateError "A mutation operation was attempted on a database that did not allow mutations." in indexedDB in Firefox

I have the following code, which throws a InvalidStateError in Firefox (when calling objectStore). The message is A mutation operation was attempted on a database that did not allow mutations..

Strangely, when I place the creation of the transaction inside the getBlob callback it seems to work.

function saveFile( fileEntry ) {
    var transaction = this;
    transaction.onerror = function( event ) {
        console.log( event );
    };

    fileEntry.getBlob( "", function( blob ) {
        var store = transaction.objectStore( STORE_NAME );
        try {
            var request = store.put( blob, fileEntry.getFullname() );
            request.onsuccess = function( event ) {
                console.log( "file: " + fileEntry.getFullname() );
                ++(progressBar[0].value);
            };
            request.onerror = function( event ) {
                console.log( "error in file " + event );
                ++(progressBar[0].value);
            };
        } catch( ex ) {
            console.log("getBlob " + ex );
        }
    }, function() {
    }, true );
}

function saveRecursive( dirEntry, missingFiles ) {
    var db = this;
    var transaction = db.transaction( [STORE_NAME],
                                  MODES.READ_WRITE );

    for( var i in dirEntry.children ) {
        var entry = dirEntry.children[i];

        if( entry.directory ) {
            createDirectory( dirEntry, entry );
            saveRecursive.call( db, entry, missingFiles );
            continue;
        }

        var index = missingFiles.indexOf( entry.getFullname() );
        if( index == -1 )
            continue;

        // Still missing - add
        missingFiles.splice( index, 1 );
        saveFile.call( transaction, entry );
    }
}

Could someone explain to me, why this is not working?

Upvotes: 2

Views: 2722

Answers (2)

Kyaw Tun
Kyaw Tun

Reputation: 13141

If getBlob is async function, this will not work:

fileEntry.getBlob( "", function( blob ) {
  var store = transaction.objectStore( STORE_NAME );

because transaction is already committed, when you get the blob.

Upvotes: 1

Josh
Josh

Reputation: 18700

Not sure if blob supported in indexeddb yet.

Upvotes: 0

Related Questions