@@ -323,56 +323,111 @@ char *get_scheduler_nodename(MemoryContext mem)
323
323
324
324
/** END of SOME UTILS **/
325
325
326
+ const char * check_multimaster_database (void )
327
+ {
328
+ char_array_t * split_libs , * conns ;
329
+ const char * libs = NULL ;
330
+ bool mtm_present = false;
331
+ static char buffer [256 ];
332
+ char * dbbeg ;
333
+ int mtm_id , i , j = 0 ;
334
+ const char * mtm_id_str , * mtm_cstring ;
335
+
336
+ /* at first need to parse shared_preload_libraries */
337
+ libs = GetConfigOption ("shared_preload_libraries" , true, false);
338
+ if (!libs ) return NULL ;
339
+ split_libs = _split_string_to_char_array ((char * )libs );
340
+ if (split_libs -> n == 0 )
341
+ {
342
+ destroyCharArray (split_libs );
343
+ return NULL ;
344
+ }
345
+ for (i = 0 ; i < split_libs -> n ; i ++ )
346
+ {
347
+ if (strcmp (split_libs -> data [i ], "multimaster" ) == 0 )
348
+ {
349
+ mtm_present = true;
350
+ break ;
351
+ }
352
+ }
353
+ destroyCharArray (split_libs );
354
+ if (0 && !mtm_present ) return NULL ;
355
+
356
+ /* now check id multimaster.node_id set */
357
+ mtm_id_str = GetConfigOption ("multimaster.node_id" , true, false);
358
+ if (!mtm_id_str ) return NULL ;
359
+ mtm_id = atoi (mtm_id_str );
360
+ if (mtm_id == 0 ) return NULL ;
361
+ elog (LOG , "got mtm_id %d" , mtm_id );
362
+
363
+ /* find proper connection string from mtm_id */
364
+ mtm_cstring = GetConfigOption ("multimaster.conn_strings" , true, false);
365
+ if (!mtm_cstring ) return NULL ;
366
+ elog (LOG , "got mtm_connstring" );
367
+
368
+ conns = _split_string_to_char_array ((char * )mtm_cstring );
369
+ if (conns -> n < mtm_id )
370
+ {
371
+ destroyCharArray (conns );
372
+ return NULL ;
373
+ }
374
+ dbbeg = strstr (conns -> data [mtm_id - 1 ], "dbname=" );
375
+ if (dbbeg == NULL )
376
+ {
377
+ destroyCharArray (conns );
378
+ return NULL ;
379
+ }
380
+ elog (LOG , "GOT BEGIN" );
326
381
382
+ memset (buffer , 0 , 256 );
383
+ for (i = 7 ; dbbeg [i ] != 0 || i < 249 ; i ++ )
384
+ {
385
+ if (dbbeg [i ] != ' ' )
386
+ {
387
+ buffer [j ++ ] = dbbeg [i ];
388
+ }
389
+ else
390
+ {
391
+ break ;
392
+ }
393
+ }
394
+ destroyCharArray (conns );
395
+ elog (LOG , "Almost ready %s" , buffer );
396
+ if (j > 0 ) return buffer ;
397
+ return NULL ;
398
+ }
327
399
328
- char_array_t * readBasesToCheck ( void )
400
+ char_array_t * _split_string_to_char_array ( char * str )
329
401
{
330
- const char * value ;
331
- int value_len = 0 ;
332
- int nnames = 0 ;
333
- char_array_t * names ;
334
- char_array_t * result ;
402
+ int str_len , cv_len = 0 , i ;
335
403
char * clean_value ;
336
- int i ;
337
- int cv_len = 0 ;
338
- StringInfoData sql ;
339
- int ret ;
404
+ char_array_t * names ;
340
405
int start_pos = 0 ;
341
- int processed ;
342
406
char * ptr = NULL ;
407
+ int nnames = 1 ;
343
408
344
-
345
- pgstat_report_activity (STATE_RUNNING , "read configuration" );
346
- result = makeCharArray ();
347
-
348
- value = GetConfigOption ("schedule.database" , true, false);
349
- if (!value || strlen (value ) == 0 )
350
- {
351
- return result ;
352
- }
353
- value_len = strlen (value );
354
- clean_value = worker_alloc (sizeof (char )* (value_len + 1 ));
355
- nnames = 1 ;
356
- for (i = 0 ; i < value_len ; i ++ )
409
+ str_len = strlen (str );
410
+ clean_value = worker_alloc (sizeof (char )* (str_len + 1 ));
411
+ for (i = 0 ; i < str_len ; i ++ )
357
412
{
358
- if (value [i ] != ' ' )
413
+ if (str [i ] != ' ' )
359
414
{
360
- if (value [i ] == ',' )
415
+ if (str [i ] == ',' )
361
416
{
362
417
nnames ++ ;
363
418
clean_value [cv_len ++ ] = 0 ;
364
419
}
365
420
else
366
421
{
367
- clean_value [cv_len ++ ] = value [i ];
422
+ clean_value [cv_len ++ ] = str [i ];
368
423
}
369
424
}
370
425
}
371
426
clean_value [cv_len ] = 0 ;
372
427
if (cv_len == 0 || nnames == cv_len )
373
428
{
374
429
pfree (clean_value );
375
- return result ;
430
+ return NULL ;
376
431
}
377
432
names = makeCharArray ();
378
433
for (i = 0 ; i < cv_len + 1 ; i ++ )
@@ -385,6 +440,39 @@ char_array_t *readBasesToCheck(void)
385
440
}
386
441
}
387
442
pfree (clean_value );
443
+
444
+ return names ;
445
+ }
446
+
447
+
448
+
449
+ char_array_t * readBasesToCheck (void )
450
+ {
451
+ const char * value = NULL ;
452
+ char_array_t * names ;
453
+ char_array_t * result ;
454
+ char * clean_value = NULL ;
455
+ int i ;
456
+ StringInfoData sql ;
457
+ int ret ;
458
+ int processed ;
459
+
460
+
461
+ pgstat_report_activity (STATE_RUNNING , "read configuration" );
462
+ result = makeCharArray ();
463
+
464
+ value = check_multimaster_database ();
465
+ elog (LOG , "From mm: %s" , value );
466
+
467
+ if (!value )
468
+ value = GetConfigOption ("schedule.database" , true, false);
469
+
470
+ if (!value || strlen (value ) == 0 )
471
+ {
472
+ return result ;
473
+ }
474
+
475
+ names = _split_string_to_char_array ((char * )value );
388
476
if (names -> n == 0 )
389
477
{
390
478
destroyCharArray (names );
0 commit comments