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