1 /* ===========================================================================
2  *
3  *                            PUBLIC DOMAIN NOTICE
4  *               National Center for Biotechnologmsgy Information
5  *
6  *  This software/database is a "United States Government Work" under the
7  *  terms of the United States Copyright Act.  It was written as part of
8  *  the author's official duties as a United States Government employee and
9  *  thus cannot be copyrighted.  This software/database is freely available
10  *  to the public for use. The National Library of Medicine and the U.S.
11  *  Government have not placed any restriction on its use or reproduction.
12  *
13  *  Although all reasonable efforts have been taken to ensure the accuracy
14  *  and reliability of the software and data, the NLM and the U.S.
15  *  Government do not and cannot warrant the performance or results that
16  *  may be obtained by using this software or data. The NLM and the U.S.
17  *  Government disclaim all warranties, express or implied, including
18  *  warranties of performance, merchantability or fitness for any particular
19  *  purpose.
20  *
21  *  Please cite the author in any work or product based on this material.
22  *
23  * ===========================================================================
24  *
25  */
26 #include "common.h"
27 
28 #include <klib/printf.h>
29 #include <klib/log.h>
30 #include <klib/out.h>
31 
32 #include <kfs/directory.h>
33 #include <kfs/file.h>
34 
log_err(const char * t_fmt,...)35 rc_t log_err( const char * t_fmt, ... )
36 {
37     rc_t rc;
38     char buffer[ 4096 ];
39     size_t num_writ;
40 
41     va_list args;
42     va_start( args, t_fmt );
43     rc = string_vprintf( buffer, sizeof buffer, &num_writ, t_fmt, args );
44     va_end( args );
45     if ( rc == 0 )
46         rc = LogMsg( klogErr, buffer );
47     return rc;
48 }
49 
50 
51 /* ----------------------------------------------------------------------------------------------- */
52 
53 
add_cols_to_cursor(const VCursor * curs,uint32_t * idx_array,const char * tbl_name,const char * acc,uint32_t n,...)54 rc_t add_cols_to_cursor( const VCursor *curs, uint32_t * idx_array,
55         const char * tbl_name, const char * acc, uint32_t n, ... )
56 {
57     rc_t rc = 0;
58     uint32_t i;
59     va_list args;
60 
61     va_start( args, n );
62 
63     for ( i = 0; i < n; i++ )
64     {
65         const char * colname = va_arg( args, const char * );
66         rc = VCursorAddColumn( curs, &( idx_array[ i ] ), colname );
67         if ( rc != 0 )
68             log_err( "cannot add '%s' to cursor for '%s'.%s %R", colname, acc, tbl_name, rc );
69     }
70 
71     va_end( args );
72 
73     if ( rc == 0 )
74     {
75         rc = VCursorOpen( curs );
76         if ( rc != 0 )
77             log_err( "cannot open cursor for '%s'.%s %R", acc, tbl_name, rc );
78     }
79 
80     return rc;
81 }
82 
83 
84 /* ----------------------------------------------------------------------------------------------- */
85 
86 
get_bool(const Args * args,const char * option,bool * value)87 rc_t get_bool( const Args * args, const char *option, bool *value )
88 {
89     uint32_t count;
90     rc_t rc = ArgsOptionCount( args, option, &count );
91     *value = ( rc == 0 && count > 0 );
92     return rc;
93 }
94 
95 
get_charptr(const Args * args,const char * option,const char ** value)96 rc_t get_charptr( const Args * args, const char *option, const char ** value )
97 {
98     uint32_t count;
99     rc_t rc = ArgsOptionCount( args, option, &count );
100     if ( rc == 0 && count > 0 )
101     {
102         rc = ArgsOptionValue( args, option, 0, ( const void ** )value );
103         if ( rc != 0 )
104             *value = NULL;
105     }
106     else
107         *value = NULL;
108     return rc;
109 }
110 
111 
get_uint32(const Args * args,const char * option,uint32_t * value,uint32_t dflt)112 rc_t get_uint32( const Args * args, const char *option, uint32_t * value, uint32_t dflt )
113 {
114     const char * svalue;
115     rc_t rc = get_charptr( args, option, &svalue );
116     if ( rc == 0 && svalue != NULL )
117         *value = atoi( svalue );
118     else
119         *value = dflt;
120     return 0;
121 }
122 
123 
string_2_size_t(const char * s,size_t dflt)124 size_t string_2_size_t( const char * s, size_t dflt )
125 {
126     size_t res = dflt;
127     if ( s != NULL )
128     {
129         size_t l = string_size( s );
130         if ( l > 0 )
131         {
132             size_t multipl = 1;
133             switch( s[ l - 1 ] )
134             {
135                 case 'k' :
136                 case 'K' : multipl = 1024; break;
137                 case 'm' :
138                 case 'M' : multipl = 1024 * 1024; break;
139                 case 'g' :
140                 case 'G' : multipl = 1024 * 1024 * 1024; break;
141             }
142 
143             if ( multipl > 1 )
144             {
145                 char * src = string_dup( s, l - 1 );
146                 if ( src != NULL )
147                 {
148                     char * endptr;
149                     res = strtol( src, &endptr, 0 ) * multipl;
150                     free( src );
151                 }
152             }
153             else
154             {
155                 char * endptr;
156                 res = strtol( s, &endptr, 0 );
157             }
158         }
159     }
160     return res;
161 }
162 
163 
get_size_t(const Args * args,const char * option,size_t * value,size_t dflt)164 rc_t get_size_t( const Args * args, const char *option, size_t * value, size_t dflt )
165 {
166 
167     const char * svalue;
168     rc_t rc = get_charptr( args, option, &svalue );
169     if ( rc == 0 && svalue != NULL )
170         *value = string_2_size_t( svalue, dflt );
171     else
172         *value = dflt;
173     return 0;
174 }
175 
176 /* ----------------------------------------------------------------------------------------------- */
177 
178 typedef struct Writer
179 {
180     KFile * f;
181     uint64_t pos;
182 } Writer;
183 
184 
writer_release(struct Writer * wr)185 rc_t writer_release( struct Writer * wr )
186 {
187     rc_t rc = 0;
188     if ( wr != NULL )
189     {
190         if ( wr->f != NULL )
191             rc = KFileRelease( wr->f );
192         free( ( void * ) wr );
193     }
194     return rc;
195 }
196 
197 
writer_make(struct Writer ** wr,const char * filename)198 rc_t writer_make( struct Writer ** wr, const char * filename )
199 {
200     rc_t rc = 0;
201     if ( wr == NULL || filename == NULL )
202     {
203         rc = RC( rcApp, rcNoTarg, rcAllocating, rcParam, rcNull );
204         log_err( "writer_make() given a NULL-ptr" );
205     }
206     else
207     {
208         KDirectory * dir;
209         rc = KDirectoryNativeDir( &dir );
210         if ( rc != 0 )
211             log_err( "writer_make() : KDirectoryNativeDir() failed %R", rc );
212         else
213         {
214             KFile * f;
215             rc = KDirectoryCreateFile( dir, &f, false, 0664, kcmInit, "%s", filename );
216             if ( rc != 0 )
217                 log_err( "writer_make() : KDirectoryCreateFile( '%s' ) failed %R", filename, rc );
218             else
219             {
220                 Writer * w = calloc( 1, sizeof *w );
221                 if ( w == NULL )
222                 {
223                     log_err( "writer_make() memory exhausted" );
224                     rc = RC( rcApp, rcNoTarg, rcAllocating, rcMemory, rcExhausted );
225                 }
226                 else
227                 {
228                     w->f = f;
229                     *wr = w;
230                 }
231             }
232             KDirectoryRelease( dir );
233         }
234     }
235     return rc;
236 }
237 
238 
writer_write(struct Writer * wr,const char * fmt,...)239 rc_t writer_write( struct Writer * wr, const char * fmt, ... )
240 {
241     rc_t rc;
242     char buffer[ 4096 ];
243     size_t num_writ_printf;
244 
245     va_list args;
246     va_start( args, fmt );
247     rc = string_vprintf( buffer, sizeof buffer, &num_writ_printf, fmt, args );
248     va_end( args );
249     if ( rc != 0 )
250         log_err( "writer_write() : string_vprintf() failed %R", rc );
251     else
252     {
253         size_t num_writ_file_write;
254         rc = KFileWriteAll( wr->f, wr->pos, buffer, num_writ_printf, &num_writ_file_write );
255         if ( rc != 0 )
256             log_err( "writer_write() : KFileWriteAll() failed %R", rc );
257         else
258             wr->pos += num_writ_file_write;
259     }
260     return rc;
261 
262 }
263 
264 
265 /* ----------------------------------------------------------------------------------------------- */
266 
clear_recorded_errors(void)267 void clear_recorded_errors( void )
268 {
269     rc_t rc;
270     const char * filename;
271     const char * funcname;
272     uint32_t line_nr;
273     while ( GetUnreadRCInfo ( &rc, &filename, &funcname, &line_nr ) )
274     {
275     }
276 }
277