@@ -304,36 +304,51 @@ sqlcmd(int argc, char **argv)
304
304
}
305
305
#endif
306
306
307
+ // Helper function to build SQL query from argv
308
+ static char * build_query (int argc , char * * argv , int start ) {
309
+ size_t len = 0 ;
310
+ for (int i = start ; i < argc ; i ++ )
311
+ len += strlen (argv [i ]) + 1 ;
312
+ if (len == 0 )
313
+ return NULL ;
314
+ char * query = malloc (len );
315
+ if (!query )
316
+ return NULL ;
317
+ char * tmp = query ;
318
+ for (int i = start ; i < argc ; i ++ ) {
319
+ strcpy (tmp , argv [i ]);
320
+ tmp += strlen (tmp );
321
+ * tmp = ' ' ;
322
+ tmp ++ ;
323
+ }
324
+ tmp [-1 ] = 0 ;
325
+ return query ;
326
+ }
327
+
307
328
int
308
329
sqlitecmdrw (int argc , char * * argv )
309
330
{
310
331
sqlite3 * db ;
311
332
int res ;
312
- int i ;
313
- char * query ;
314
- char * tmp ;
333
+ char * query = NULL ;
315
334
char * dbdir ;
316
335
char * dbfile ;
317
336
int ret = 0 ;
318
- sqlite3_stmt * stmt ;
337
+ sqlite3_stmt * stmt = NULL ;
319
338
char * cp ;
320
339
int maxretry = 50 ;
321
340
int retry = 0 ;
322
341
323
- // const char journal_mode_sql[] = "PRAGMA journal_mode = MEMORY;";
324
- // const char journal_mode_sql[] = "PRAGMA journal_mode = WAL;"; //
325
- // SR - not used?
326
-
327
342
if (argc < 3 ) {
328
343
out1fmt ("%s: format: %s <dbfile> <query>\n" , nm (), nm ());
329
- return ( 1 ); // SR: Usage should also give an error for scripting
344
+ return 1 ;
330
345
}
331
346
332
347
if (argv [1 ][0 ] == '@' ) {
333
348
#ifndef WITH_DBI
334
349
printf (
335
350
"External SQL not implemented, recompile cbsdsh WITH_DBI\n" );
336
- return ( 1 ) ;
351
+ return 1 ;
337
352
#else
338
353
return (sqlcmd (argc , argv ));
339
354
#endif
@@ -344,29 +359,33 @@ sqlitecmdrw(int argc, char **argv)
344
359
else
345
360
delim = cp ;
346
361
if (argv [1 ][0 ] != '/' ) {
347
- // search file in dbdir
348
362
dbdir = lookupvar ("dbdir" );
349
- i = strlen (dbdir ) + strlen (argv [1 ]);
350
- dbfile = calloc (strlen (dbdir ) + strlen (argv [1 ]) +
351
- strlen (DBPOSTFIX ) + 1 ,
352
- sizeof (char * ));
353
-
363
+ if (!dbdir ) {
364
+ error ("dbdir not set!\n" );
365
+ return 1 ;
366
+ }
367
+ size_t dbfile_len = strlen (dbdir ) + strlen (argv [1 ]) + strlen (DBPOSTFIX ) + 2 ;
368
+ dbfile = calloc (dbfile_len , sizeof (char ));
354
369
if (dbfile == NULL ) {
355
370
error ("Out of memory!\n" );
356
- return ( 1 ) ;
371
+ return 1 ;
357
372
}
358
- sprintf (dbfile , "%s/%s%s" , dbdir , argv [1 ], DBPOSTFIX );
373
+ snprintf (dbfile , dbfile_len , "%s/%s%s" , dbdir , argv [1 ], DBPOSTFIX );
359
374
} else {
360
- dbfile = calloc (strlen (argv [1 ]) + 1 , sizeof (char * ));
361
- sprintf (dbfile , "%s" , argv [1 ]);
375
+ size_t dbfile_len = strlen (argv [1 ]) + 1 ;
376
+ dbfile = calloc (dbfile_len , sizeof (char ));
377
+ if (dbfile == NULL ) {
378
+ error ("Out of memory!\n" );
379
+ return 1 ;
380
+ }
381
+ snprintf (dbfile , dbfile_len , "%s" , argv [1 ]);
362
382
}
363
383
364
384
if (SQLITE_OK !=
365
385
(res = sqlite3_open_v2 (dbfile , & db ,
366
386
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
367
387
SQLITE_OPEN_SHAREDCACHE ,
368
388
NULL ))) {
369
- // if (SQLITE_OK != (res = sqlite3_open(dbfile, &db))) {
370
389
out1fmt ("%s: Can't open database file: %s\n" , nm (), dbfile );
371
390
free (dbfile );
372
391
return 1 ;
@@ -378,27 +397,14 @@ sqlitecmdrw(int argc, char **argv)
378
397
sql_exec (db , "PRAGMA journal_mode = WAL;" );
379
398
sql_exec (db , "PRAGMA synchronous = NORMAL;" );
380
399
381
- // https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted
382
400
sqlite3_db_config (db , SQLITE_DBCONFIG_DQS_DDL , 1 , (void * )0 );
383
401
sqlite3_db_config (db , SQLITE_DBCONFIG_DQS_DML , 1 , (void * )0 );
384
402
385
- // sql_exec(db, "PRAGMA journal_mode=DELETE;");
386
- // sql_exec(db,"PRAGMA journal_mode = OFF;");
387
- // sql_exec(db,"PRAGMA journal_mode = TRUNCATE;");
388
-
389
- res = 0 ;
390
- for (i = 2 ; i < argc ; i ++ )
391
- res += strlen (argv [i ]) + 1 ;
392
- if (res ) {
393
- query = (char * )sqlite3_malloc (res );
394
- tmp = query ;
395
- for (i = 2 ; i < argc ; i ++ ) {
396
- strcpy (tmp , argv [i ]);
397
- tmp += strlen (tmp );
398
- * tmp = ' ' ;
399
- tmp ++ ;
400
- }
401
- tmp [-1 ] = 0 ;
403
+ query = build_query (argc , argv , 2 );
404
+ if (!query ) {
405
+ sqlite3_close (db );
406
+ error ("Failed to build query string!\n" );
407
+ return 1 ;
402
408
}
403
409
404
410
do {
@@ -407,27 +413,21 @@ sqlitecmdrw(int argc, char **argv)
407
413
sqlite3_exec (db , "COMMIT" , 0 , 0 , 0 );
408
414
if (ret == SQLITE_OK )
409
415
break ;
410
- // if (ret==SQLITE_BUSY) {
411
- // usleep(15000);
412
416
retry ++ ;
413
-
414
417
if (retry > maxretry )
415
418
break ;
416
- // sqlite3_prepare_v2(db, journal_mode_sql, -1,
417
- //&stmt, NULL);
418
419
} while (ret != SQLITE_OK );
419
420
420
421
if (ret == SQLITE_OK ) {
421
422
ret = sqlite3_step (stmt );
422
-
423
- // Handle the results
424
423
while (ret == SQLITE_ROW ) {
425
424
sqlCB (stmt );
426
425
ret = sqlite3_step (stmt );
427
426
}
428
427
}
429
428
430
- sqlite3_finalize (stmt );
429
+ if (stmt )
430
+ sqlite3_finalize (stmt );
431
431
sqlite3_free (query );
432
432
sqlite3_close (db );
433
433
@@ -439,24 +439,19 @@ sqlitecmdro(int argc, char **argv)
439
439
{
440
440
sqlite3 * db ;
441
441
int res ;
442
- int i ;
443
- char * query ;
444
- char * tmp ;
442
+ char * query = NULL ;
445
443
char * dbdir ;
446
444
char * dbfile ;
447
445
int ret = 0 ;
448
- sqlite3_stmt * stmt ;
446
+ sqlite3_stmt * stmt = NULL ;
449
447
char * cp ;
450
448
int maxretry = 50 ;
451
449
int retry = 0 ;
452
450
453
- // const char journal_mode_sql[] = "PRAGMA journal_mode = MEMORY;";
454
- // const char journal_mode_sql[] = "PRAGMA journal_mode=DELETE;";
455
-
456
451
if (argv [1 ][0 ] == '@' ) {
457
452
#ifndef WITH_DBI
458
453
printf ("External SQL not implemented, recompile WITH_DBI\n" );
459
- return ( 1 ) ;
454
+ return 1 ;
460
455
#else
461
456
return (sqlcmd (argc , argv ));
462
457
#endif
@@ -473,21 +468,26 @@ sqlitecmdro(int argc, char **argv)
473
468
}
474
469
475
470
if (argv [1 ][0 ] != '/' ) {
476
- // search file in dbdir
477
471
dbdir = lookupvar ("dbdir" );
478
- i = strlen (dbdir ) + strlen (argv [1 ]);
479
- dbfile = calloc (strlen (dbdir ) + strlen (argv [1 ]) +
480
- strlen (DBPOSTFIX ) + 1 ,
481
- sizeof (char * ));
482
-
472
+ if (!dbdir ) {
473
+ error ("dbdir not set!\n" );
474
+ return 1 ;
475
+ }
476
+ size_t dbfile_len = strlen (dbdir ) + strlen (argv [1 ]) + strlen (DBPOSTFIX ) + 2 ;
477
+ dbfile = calloc (dbfile_len , sizeof (char ));
483
478
if (dbfile == NULL ) {
484
479
error ("Out of memory!\n" );
485
- return ( 1 ) ;
480
+ return 1 ;
486
481
}
487
- sprintf (dbfile , "%s/%s%s" , dbdir , argv [1 ], DBPOSTFIX );
482
+ snprintf (dbfile , dbfile_len , "%s/%s%s" , dbdir , argv [1 ], DBPOSTFIX );
488
483
} else {
489
- dbfile = calloc (strlen (argv [1 ]) + 1 , sizeof (char * ));
490
- sprintf (dbfile , "%s" , argv [1 ]);
484
+ size_t dbfile_len = strlen (argv [1 ]) + 1 ;
485
+ dbfile = calloc (dbfile_len , sizeof (char ));
486
+ if (dbfile == NULL ) {
487
+ error ("Out of memory!\n" );
488
+ return 1 ;
489
+ }
490
+ snprintf (dbfile , dbfile_len , "%s" , argv [1 ]);
491
491
}
492
492
493
493
if (SQLITE_OK !=
@@ -501,52 +501,37 @@ sqlitecmdro(int argc, char **argv)
501
501
502
502
sqlite3_busy_timeout (db , CBSD_SQLITE_BUSY_TIMEOUT );
503
503
504
- res = 0 ;
505
- for (i = 2 ; i < argc ; i ++ )
506
- res += strlen (argv [i ]) + 1 ;
507
-
508
- if (res ) {
509
- query = (char * )sqlite3_malloc (res );
510
- tmp = query ;
511
- for (i = 2 ; i < argc ; i ++ ) {
512
- strcpy (tmp , argv [i ]);
513
- tmp += strlen (tmp );
514
- * tmp = ' ' ;
515
- tmp ++ ;
516
- }
517
- tmp [-1 ] = 0 ;
504
+ query = build_query (argc , argv , 2 );
505
+ if (!query ) {
506
+ sqlite3_close (db );
507
+ error ("Failed to build query string!\n" );
508
+ return 1 ;
518
509
}
519
510
520
511
sql_exec (db , "PRAGMA mmap_size = 209715200;" );
521
512
522
- // https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted
523
513
sqlite3_db_config (db , SQLITE_DBCONFIG_DQS_DDL , 1 , (void * )0 );
524
514
sqlite3_db_config (db , SQLITE_DBCONFIG_DQS_DML , 1 , (void * )0 );
525
515
526
516
do {
527
517
ret = sqlite3_prepare_v2 (db , query , -1 , & stmt , NULL );
528
518
if (ret == SQLITE_OK )
529
519
break ;
530
- // if (ret==SQLITE_BUSY) {
531
- // usleep(15000);
532
520
retry ++ ;
533
521
if (retry > maxretry )
534
522
break ;
535
- // sqlite3_prepare_v2(db, journal_mode_sql, -1,
536
- //&stmt, NULL);
537
-
538
523
} while (ret != SQLITE_OK );
539
524
540
525
if (ret == SQLITE_OK ) {
541
526
ret = sqlite3_step (stmt );
542
-
543
527
while (ret == SQLITE_ROW ) {
544
528
sqlCB (stmt );
545
529
ret = sqlite3_step (stmt );
546
530
}
547
531
}
548
532
549
- sqlite3_finalize (stmt );
533
+ if (stmt )
534
+ sqlite3_finalize (stmt );
550
535
sqlite3_free (query );
551
536
sqlite3_close (db );
552
537
0 commit comments