File* FileStreamWrapper::open(const String& filename, const String& mode, int options, const Variant& context) { String fname = !strncmp(filename.data(), "file://", sizeof("file://") - 1) ? filename.substr(sizeof("file://") - 1) : filename; if (MemFile *file = openFromCache(fname, mode)) { return file; } if (options & File::USE_INCLUDE_PATH) { struct stat s; String resolved_fname = Eval::resolveVmInclude(fname.get(), "", &s); if (!resolved_fname.isNull()) { fname = resolved_fname; } } std::unique_ptr<PlainFile> file(NEWOBJ(PlainFile)()); bool ret = file->open(File::TranslatePath(fname), mode); if (!ret) { raise_warning("%s", file->getLastError().c_str()); return nullptr; } return file.release(); }
void readCachedSeqPart(char *seqName, int start, int size, boolean getMasked, struct hash *hash, struct dlList *fileCache, struct dnaSeq **retSeq, int *retOffset, boolean *retIsNib) /* Read sequence hopefully using file cashe. If sequence is in a nib * file just read part of it. */ { struct seqFilePos *sfp = hashMustFindVal(hash, seqName); FILE *f = openFromCache(fileCache, sfp); if (sfp->isTwoBit) { *retSeq = twoBitReadSeqFrag((struct twoBitFile *)f, seqName, start, start + size); *retOffset = start; *retIsNib = TRUE; } else if (sfp->isNib) { *retSeq = nibLdPartMasked((getMasked ? NIB_MASK_MIXED : 0), sfp->file, f, sfp->pos, start, size); *retOffset = start; *retIsNib = TRUE; } else { if (getMasked) errAbort("masked sequences not supported with fasta files"); *retSeq = readSeqFromFaPos(sfp, f); *retOffset = 0; *retIsNib = FALSE; } }
void readCachedSeqPart(char *seqName, int start, int size, struct hash *hash, struct dlList *fileCache, struct dnaSeq **retSeq, int *retOffset, boolean *retIsPartial) /* Read sequence hopefully using file cashe. If sequence is in a nib * file just read part of it. */ { struct seqFilePos *sfp = hashMustFindVal(hash, seqName); FILE *f = openFromCache(fileCache, sfp->file); if (sfp->isNib) { *retSeq = nibLdPartMasked(NIB_MASK_MIXED, sfp->file, f, sfp->pos, start, size); *retOffset = start; *retIsPartial = TRUE; } else if (sfp->isTwoBit) { *retSeq = twoBitReadSeqFrag(sfp->tbf, seqName, start, start+size); *retOffset = start; *retIsPartial = TRUE; } else { *retSeq = readSeqFromFaPos(sfp, f); *retOffset = 0; *retIsPartial = FALSE; } }
SmartPtr<File> FileStreamWrapper::open(const String& filename, const String& mode, int options, const SmartPtr<StreamContext>& context) { String fname; if (StringUtil::IsFileUrl(filename)) { fname = StringUtil::DecodeFileUrl(filename); if (fname.empty()) { raise_warning("invalid file:// URL"); return nullptr; } } else { fname = filename; } if (auto file = openFromCache(fname, mode)) { return file; } if (options & File::USE_INCLUDE_PATH) { struct stat s; String resolved_fname = resolveVmInclude(fname.get(), "", &s); if (!resolved_fname.isNull()) { fname = resolved_fname; } } auto file = makeSmartPtr<PlainFile>(); bool ret = file->open(File::TranslatePath(fname), mode); if (!ret) { raise_warning("%s", file->getLastError().c_str()); return nullptr; } return file; }
File* FileStreamWrapper::open(CStrRef filename, CStrRef mode, int options, CVarRef context) { String fname = !strncmp(filename.data(), "file://", sizeof("file://") - 1) ? filename.substr(sizeof("file://") - 1) : filename; if (MemFile *file = openFromCache(fname, mode)) { return file; } std::unique_ptr<PlainFile> file(NEWOBJ(PlainFile)()); bool ret = file->open(File::TranslatePath(fname), mode); if (!ret) { raise_warning("%s", file->getLastError().c_str()); return NULL; } return file.release(); }
struct dnaSeq *readFromCache(struct dlList *cache, char *dirName, char *seqName, int start, int size, int seqSize, boolean isTwoBit) /* Return dnaSeq read from the appropriate nib file. * You need to dnaSeqFree this when done (it is the nib * file that is cached, not the sequence). */ { struct cachedSeqFile *cn = openFromCache(cache, dirName, seqName, isTwoBit); if (isTwoBit) { return twoBitReadSeqFrag(cn->tbf, seqName, start, start+size); } else { if (seqSize != cn->size) errAbort("%s/%s is %d bases in .lav file and %d in .nib file\n", dirName, seqName, seqSize, cn->size); if ((start+size) > cn->size ) printf("%s/%s is %d bases in .lav file and %d in .nib file start %d size %d end %d\n", dirName, seqName, seqSize, cn->size, start, size, start+size); return nibLdPartMasked(NIB_MASK_MIXED, cn->fileName, cn->f, cn->size, start, size); } }