break layer->data into geometry_column_name, table_name and srid */
| 344 | |
| 345 | /* break layer->data into geometry_column_name, table_name and srid */ |
| 346 | static int msSplitData( char *data, char **geometry_column_name, char **table_name, char **unique, char **srid, int *function, int *version ) |
| 347 | { |
| 348 | char *tok_from = "from"; |
| 349 | char *tok_using = "using"; |
| 350 | char *tok_unique = "unique"; |
| 351 | char *tok_srid = "srid"; |
| 352 | char *tok_version = "version"; |
| 353 | char data_version[4] = ""; |
| 354 | char tok_function[11] = ""; |
| 355 | int parenthesis, i; |
| 356 | char *src = data, *tgt; |
| 357 | int table_name_size = TABLE_NAME_SIZE; |
| 358 | size_t buffer_size = 0; |
| 359 | |
| 360 | /* bad 'data' */ |
| 361 | if (data == NULL) |
| 362 | return 0; |
| 363 | |
| 364 | buffer_size = strlen(data)+1; |
| 365 | *geometry_column_name = (char*)malloc(buffer_size); |
| 366 | *unique = (char*)malloc(buffer_size); |
| 367 | *srid = (char*)malloc(buffer_size); |
| 368 | |
| 369 | /* clearup */ |
| 370 | **geometry_column_name = **table_name = 0; |
| 371 | |
| 372 | /* parsing 'geometry_column_name' */ |
| 373 | for( ;*src && isspace( *src ); src++ ); /* skip blanks */ |
| 374 | for( tgt=*geometry_column_name; *src; src++, tgt++ ) |
| 375 | if (isspace( *src )) |
| 376 | break; |
| 377 | else |
| 378 | *tgt = *src; |
| 379 | *tgt = 0; |
| 380 | |
| 381 | /* parsing 'from' */ |
| 382 | for( ;*src && isspace( *src ); src++ ) ; /* skip blanks */ |
| 383 | for( ;*src && *tok_from && tolower(*src)==*tok_from; src++, tok_from++ ); |
| 384 | if (*tok_from != '\0') |
| 385 | return 0; |
| 386 | |
| 387 | /* parsing 'table_name' or '(SELECT stmt)' */ |
| 388 | i = 0; |
| 389 | for( ;*src && isspace( *src ); src++ ); /* skip blanks */ |
| 390 | for( tgt=*table_name, parenthesis=0; *src; src++, tgt++, ++i ) |
| 391 | { |
| 392 | if (*src == '(') |
| 393 | parenthesis++; |
| 394 | else if (*src == ')') |
| 395 | parenthesis--; |
| 396 | else if (parenthesis==0 && isspace( *src )) |
| 397 | break; /* stop on spaces */ |
| 398 | /* double the size of the table_name array if necessary */ |
| 399 | if (i == table_name_size) { |
| 400 | table_name_size *= 2; |
| 401 | *table_name = (char *) realloc(*table_name,sizeof(char *) * table_name_size); |
| 402 | } |
| 403 | *tgt = *src; |
no test coverage detected