~zorba-coders/zorba/xqxq-memory-smash

« back to all changes in this revision

Viewing changes to src/xqxq.xq.src/xqxq.cpp

  • Committer: chillery+launchpad at lambda
  • Date: 2012-10-20 02:18:45 UTC
  • Revision ID: chillery+launchpad@lambda.nu-20121020021845-zrcl58fh5jktwzxd
Release URIMapper/URLResolver when there is a compilation error. Fixes
"URIs remain in string pool" error.

Show diffs side-by-side

added added

removed removed

Lines of Context:
391
391
    XQuery_t lQuery;
392
392
    
393
393
    StaticContext_t ltempSctx = lZorba->createStaticContext();
394
 
    XQXQURLResolver* lResolver = NULL;
395
 
    XQXQURIMapper* lMapper = NULL;
 
394
    std::auto_ptr<XQXQURLResolver> lResolver;
 
395
    std::auto_ptr<XQXQURIMapper> lMapper;
396
396
 
397
397
    if ( aArgs.size() > 2 )
398
398
    {
399
399
      Item lMapperFunctionItem = getItemArgument(aArgs, 2);
400
400
      if (!lMapperFunctionItem.isNull())
401
401
      {
402
 
        lMapper = new XQXQURIMapper(lMapperFunctionItem, lSctxChild);
403
 
        ltempSctx->registerURIMapper(lMapper);
 
402
        lMapper.reset(new XQXQURIMapper(lMapperFunctionItem, lSctxChild));
 
403
        ltempSctx->registerURIMapper(lMapper.get());
404
404
      }
405
405
    }
406
406
 
409
409
      Item lResolverFunctionItem = getItemArgument(aArgs, 1);
410
410
      if (!lResolverFunctionItem.isNull())
411
411
      {
412
 
        lResolver = new XQXQURLResolver(lResolverFunctionItem, lSctxChild);
413
 
        ltempSctx->registerURLResolver(lResolver);
 
412
        lResolver.reset(new XQXQURLResolver(lResolverFunctionItem, lSctxChild));
 
413
        ltempSctx->registerURLResolver(lResolver.get());
414
414
      }
415
415
 
416
416
    }
421
421
    }
422
422
    catch (XQueryException& xe)
423
423
    {
 
424
      lQuery = NULL;
424
425
      std::ostringstream err;
425
426
      err << "The query compiled using xqxq:prepare-main-module raised an error at"
426
427
          << " line " << xe.source_line() << " column " << xe.source_column() << ": " << xe.what();
430
431
    }
431
432
    catch (ZorbaException& e)
432
433
    {
 
434
      lQuery = NULL;
433
435
      std::ostringstream err;
434
436
      err << "The query compiled using xqxq:prepare-main-module raised an error: "
435
437
          << e.what();
437
439
          e.diagnostic().qname().ns(), e.diagnostic().qname().localname());
438
440
      throw USER_EXCEPTION(errQName, err.str());
439
441
    }
440
 
    
 
442
 
441
443
    uuid lUUID;
442
444
    uuid::create(&lUUID);
443
445
    
446
448
 
447
449
    String lStrUUID = lStream.str();
448
450
 
449
 
    lQueryMap->storeQuery(lStrUUID, lQuery, lMapper, lResolver);
 
451
    lQueryMap->storeQuery(lStrUUID, lQuery, lMapper.release(), lResolver.release());
450
452
    
451
453
    return ItemSequence_t(new SingletonItemSequence(XQXQModule::getItemFactory()->createAnyURI(lStrUUID)));
452
454
  }