Esempio n. 1
0
static rc_t SaveToFile( struct KFile * f, const VNamelist * nl, const char * delim )
{
    uint32_t count;
    rc_t rc = VNameListCount ( nl, &count );
    if ( rc == 0 && count > 0 )
    {
        uint32_t idx;
        uint64_t pos = 0;
        for ( idx = 0; idx < count && rc == 0; ++idx )
        {
            const char * s;
            rc = VNameListGet ( nl, idx, &s );
            if ( rc == 0 && s != NULL )
            {
                size_t num_writ;
                rc = KFileWriteAll ( f, pos, s, string_size ( s ), &num_writ );
                if ( rc == 0 )
                {
                    pos += num_writ;
                    rc = KFileWriteAll ( f, pos, delim, string_size ( delim ), &num_writ );
                    if ( rc == 0 )
                        pos += num_writ;
                }
            }
        }
        if ( rc == 0 )
            rc = KFileSetSize ( f, pos );
    }
    return rc;
}
Esempio n. 2
0
static rc_t CC out_redir_callback( void * self, const char * buffer, size_t bufsize, size_t * num_writ )
{
    out_redir * redir = ( out_redir * )self;
    rc_t rc = KFileWriteAll( redir->kfile, redir->pos, buffer, bufsize, num_writ );
    if ( rc == 0 )
        redir->pos += *num_writ;
    return rc;
}
Esempio n. 3
0
static rc_t write_to_file( struct rna_splice_log * sl, const uint8_t * src, size_t len )
{
    size_t num_writ;
    rc_t rc = KFileWriteAll( sl->log_file, sl->log_file_pos, src, len, &num_writ );
    if ( rc == 0 )
        sl->log_file_pos += num_writ;
    return rc;
}
Esempio n. 4
0
rc_t write_packed_to_lookup_writer( struct lookup_writer * writer,
                                    uint64_t key,
                                    const String * bases_as_packed_4na )
{
    size_t num_writ;
    /* first write the key ( combination of seq-id and read-id ) */
    rc_t rc = KFileWriteAll( writer -> f, writer -> pos, &key, sizeof key, &num_writ );
    if ( rc != 0 )
    {
        ErrMsg( "KFileWriteAll( key ) -> %R", rc );
    }
    else if ( num_writ != sizeof key )
    {
        rc = RC( rcVDB, rcNoTarg, rcWriting, rcFormat, rcInvalid );
        ErrMsg( "KFileWriteAll( key ) -> %R", rc );
    }
    else
    {
        uint64_t start_pos = writer -> pos; /* store the pos to be written later to the index... */
            
        writer -> pos += num_writ;
        /* now write the packed 4na ( length + packed data ) */
        rc = KFileWriteAll( writer -> f,
                            writer -> pos,
                            bases_as_packed_4na -> addr,
                            bases_as_packed_4na -> size,
                            &num_writ );
        if ( rc != 0 )
            ErrMsg( "KFileWriteAll( bases ) -> %R", rc );
        else if ( num_writ != bases_as_packed_4na -> size )
        {
            rc = RC( rcVDB, rcNoTarg, rcWriting, rcFormat, rcInvalid );
            ErrMsg( "KFileWriteAll( bases ) -> %R", rc );
        }
        else
        {
            if ( writer -> idx != NULL )
                rc = write_key( writer -> idx, key, start_pos );
            writer->pos += num_writ;
        }
    }
    return rc;
}
Esempio n. 5
0
/*
 * Copy a file from a const KFile * to a KFile * with the paths for the two
 * for logging purposes
 *
 * return rc_t = 0 for success
 * return rc_t != 0 for failure
 */
rc_t CopyFile (const KFile * src, KFile * dst, const char * source, const char * dest)
{
    rc_t rc;
    uint8_t	buff	[256 * 1024];
    size_t	num_read;
    size_t      num_writ;
    uint64_t	pos;

    for (pos = 0; ; pos += num_read)
    {
        rc = Quitting ();
        if (rc)
        {
            LOGMSG (klogFatal, "Received quit");
            break;
        }

        rc = KFileReadAll (src, pos, buff, sizeof (buff), &num_read);
        if (rc)
        {
            PLOGERR (klogErr,
                     (klogErr, rc,
                      "Failed to read from file $(F) at $(P)",
                      "F=%s,P=%lu", source, pos));
            break;
        }

        if (num_read == 0)
            break;

        rc = KFileWriteAll (dst, pos, buff, num_read, &num_writ);
        if (rc)
        {
            PLOGERR (klogErr,
                     (klogErr, rc,
                      "Failed to write to file $(F) at $(P)",
                      "F=%s,P=%lu", dest, pos));
            break;
        }

        if (num_writ != num_read)
        {
            rc = RC (rcExe, rcFile, rcWriting, rcFile, rcInsufficient);
            PLOGERR (klogErr,
                     (klogErr, rc,
                      "Failed to write all to file $(F) at $(P)",
                      "F=%s,P=%lu", dest, pos));
            break;
        }
    }
    return rc;
}
Esempio n. 6
0
rc_t CC
TCopyFile ( struct KFile * file_dst, struct KFile * file_src )
{
    rc_t rc = 0;
    
    uint64_t size_src;
    rc = KFileSize ( file_src, &size_src );
    if (rc != 0)
    {
        return rc;
    }
    
    if (size_src == 0)
    {
        // do nothing
        return rc;
    }
    
    const size_t buffer_size = 32*1024;
    
    uint8_t buffer[buffer_size];
   
    uint64_t num_copied_total = 0;
    size_t num_read, num_written;
    while (num_copied_total < size_src)
    {
        size_t to_copy = size_src - num_copied_total;
        if (to_copy > buffer_size)
        {
            to_copy = buffer_size;
        }
        rc = KFileReadAll ( file_src, num_copied_total, buffer, to_copy, &num_read );
        if (rc != 0)
        {
            break;
        }
        assert(num_read == to_copy);
        rc = KFileWriteAll ( file_dst, num_copied_total, buffer, to_copy, &num_written );
        if (rc != 0)
        {
            break;
        }
        assert(num_written == to_copy);
        
        num_copied_total += num_written;
    }
    
    return rc;
}
Esempio n. 7
0
rc_t CC
TFillFile ( struct KFile * file, const uint8_t* filler, size_t filler_size, uint64_t content_size )
{
    rc_t rc = 0;
    
    if (content_size == 0)
    {
        // do nothing
        return rc;
    }
    
    const size_t buffer_size = 32*1024;
    
    uint8_t buffer[buffer_size];
    size_t filler_sizes_in_buffer = buffer_size / filler_size;
    
    assert(buffer_size % filler_size == 0);
    assert(buffer_size / filler_size  > 0);

    for (size_t i = 0; i < filler_sizes_in_buffer; ++i)
    {
        memmove(buffer + i*filler_size, filler, filler_size);
    }

    uint64_t num_written_total = 0;
    size_t num_written;
    while (num_written_total < content_size)
    {
        size_t to_write = content_size - num_written_total;
        if (to_write > buffer_size)
        {
            to_write = buffer_size;
        }
        rc = KFileWriteAll ( file, num_written_total, buffer, to_write, &num_written );
        if (rc != 0)
        {
            break;
        }
        
        assert(num_written == to_write);
        num_written_total += num_written;
    }
    
    return rc;
}
Esempio n. 8
0
/* RunWrite
 *  runs write loop on background thread
 */
static
rc_t CC KQueueFileRunWrite ( const KThread *t, void *data )
{
    KQueueFile *self = data;

    rc_t rc;
    do
    {
        size_t num_writ;
        KQueueFileBuffer *b;

        /* timeout is in mS */
        timeout_t tm;
        TimeoutInit ( & tm, self->timeout_ms );

        /* pop buffer */
        rc = KQueuePop ( self -> q, ( void** ) & b, & tm );
        if ( rc != 0 )
        {
            /* see if the fg thread is done */
            if ( GetRCState ( rc ) == rcDone && GetRCObject ( rc ) == ( enum RCObject )rcData )
            {
                rc = 0;
            }
            else if ( GetRCObject(rc) == ( enum RCObject )rcTimeout && GetRCState(rc) == rcExhausted )
            {
                rc = 0;
                continue;
            }

            break;
        }

        /* queue won't accept NULL object references */
        assert ( b != NULL );

        /* look at buffer for end of input */
        if ( b -> rc != 0 || b -> bytes == 0 )
        {
            free ( b );
            break;
        }

        /* write to file */
        rc = KFileWriteAll ( self -> f, b -> pos, b -> data, b -> bytes, & num_writ );
        assert ( num_writ == b -> bytes || rc != 0 );

        /* TBD - need a better way to deal with this */
        if ( rc != 0 )
        {
            PLOGERR ( klogSys, ( klogSys, rc, "$(func): wrote $(num_writ) of $(bytes) bytes to file",
                                 "func=%s,num_writ=%zu,bytes=%zu", __func__, num_writ, b -> bytes ) );
        }

        /* done with buffer */
        free ( b );
    }
    while ( rc == 0 );

    /* going to exit thread */
    KQueueSeal ( self -> q );

    return rc;
}
Esempio n. 9
0
static
rc_t copy_file (const char * src, const char * dst, const KFile * fin, KFile *fout)
{
    rc_t rc;
    uint8_t	buff	[64 * 1024];
    size_t	num_read;
    uint64_t	inpos;
    uint64_t	outpos;

    assert (src);
    assert (dst);
    assert (fin);
    assert (fout);

    inpos = 0;
    outpos = 0;

#if 1
    for (inpos = 0; ; inpos += num_read)
    {
        rc = Quitting ();
        if (rc)
        {
            LOGMSG (klogFatal, "Received quit");
            break;
        }
        else
        {
            rc = KFileReadAll (fin, inpos, buff, sizeof (buff), &num_read);
            if (rc)
            {
                PLOGERR (klogErr,
                         (klogErr, rc,
                          "Failed to read from file $(F) at $(P)",
                          "F=%s,P=%lu", src, inpos));
                break;
            }
            else if (num_read)
            {
                size_t num_writ;

                rc = KFileWriteAll (fout, inpos, buff, num_read, &num_writ);
                if (rc)
                {
                    PLOGERR (klogErr,
                             (klogErr, rc,
                              "Failed to write to file $(F) at $(P)",
                              "F=%s,P=%lu", dst, outpos));
                    break;
                }
                else if (num_writ != num_read)
                {
                    rc = RC (rcExe, rcFile, rcWriting, rcFile, rcInsufficient);
                    PLOGERR (klogErr,
                             (klogErr, rc,
                              "Failed to write all to file $(F) at $(P)",
                              "F=%s,P=%lu", dst, outpos));
                    break;
                }
            }
            else 
                break;
        }
    }
#else
    do
    {
        rc = Quitting ();
        if (rc)
        {
            LOGMSG (klogFatal, "Received quit");
            break;
        }
        rc = KFileRead (fin, inpos, buff, sizeof (buff), &num_read);
        if (rc)
        {
            PLOGERR (klogErr,
                     (klogErr, rc,
                      "Failed to read from file $(F) at $(P)",
                      "F=%s,P=%lu", src, inpos));
            break;
        }
        else if (num_read > 0)
        {
            size_t to_write;

            inpos += (uint64_t)num_read;

            STSMSG (2, ("Read %zu bytes to %lu", num_read, inpos));

            to_write = num_read;
            while (to_write > 0)
            {
                size_t num_writ;
                rc = KFileWrite (fout, outpos, buff, num_read, &num_writ);
                if (rc)
                {
                    PLOGERR (klogErr,
                             (klogErr, rc,
                              "Failed to write to file $(F) at $(P)",
                              "F=%s,P=%lu", dst, outpos));
                    break;
                }
                outpos += num_writ;
                to_write -= num_writ;
            }
        }
        if (rc)
            break;
    } while (num_read != 0);
#endif
    return rc;
}