/**
 * memsuperblob: simple in-memory superblob implementation
 */

#include "persifs.h"
#include "memsuperblob.h"
#include "happyio.h"
#include "blobindex.h"

void
memSuperblob::create(callback<void, ref<memSuperblob> >::ref cb,
                     cbe error)
{
  cb(New refcounted<memSuperblob>());
}


memSuperblob::memSuperblob()
{
  nextAddr = 0;
}


void
memSuperblob::put(str blobContent,
                  callback<void, blockFingerprint, blockAddress>::ref cb,
                  cbe error)
{
  blockFingerprint fp;
  blockAddress addr;

  sha1_hash(&fp, blobContent.cstr(), blobContent.len());
  
  memBlobEnt *ent = dataByFP[fp];
  
  if (ent != NULL) {
    cb(fp, ent->addr);
  } else {
    addr = nextAddr++;

    ent = New memBlobEnt;
    ent->fp = fp;
    ent->addr = addr;
    ent->data = blobContent;

    dataByFP.insert(ent);
    dataByAddr.insert(ent);
    
    cb(fp, addr);
  }
  
    
}

void
memSuperblob::get(blockFingerprint fingerprint,
                  callback<void, str, blockAddress>::ref cb, cbe error)
{
  memBlobEnt *ent = dataByFP[fingerprint];

  if (ent == NULL) {
    error(PERR_NOENT);
  } else {
    cb(ent->data, ent->addr);
  }
}

void
memSuperblob::getDirect(blockAddress address,
                        callback<void, str, blockAddress>::ref cb,
                        cbe error)
{
  memBlobEnt *ent = dataByAddr[address];

  if (ent == NULL) {
    error(PERR_NOENT);
  } else {
    cb(ent->data, ent->addr);
  }  
}

memSuperblob::~memSuperblob()
{

}
