/* describe table, if c is not NULL cur->cols and cur->ncols is also set */ int describe_table(PGresult * res, dbTable ** table, cursor * c) { int i, ncols, kcols; int pgtype, gpgtype; char *fname; int sqltype, fsize, precision, scale; dbColumn *column; G_debug(3, "describe_table()"); ncols = PQnfields(res); /* Count columns of known type */ kcols = 0; for (i = 0; i < ncols; i++) { get_column_info(res, i, &pgtype, &gpgtype, &sqltype, &fsize); if (sqltype == DB_SQL_TYPE_UNKNOWN) continue; kcols++; /* known types */ } G_debug(3, "kcols = %d", kcols); if (!(*table = db_alloc_table(kcols))) { return DB_FAILED; } if (c) { c->ncols = kcols; c->cols = (int *)G_malloc(kcols * sizeof(int)); } /* set the table name */ /* TODO */ db_set_table_name(*table, ""); /* set the table description */ db_set_table_description(*table, ""); /* TODO */ /* db_set_table_delete_priv_granted (*table); db_set_table_insert_priv_granted (*table); db_set_table_delete_priv_not_granted (*table); db_set_table_insert_priv_not_granted (*table); */ kcols = 0; for (i = 0; i < ncols; i++) { fname = PQfname(res, i); get_column_info(res, i, &pgtype, &gpgtype, &sqltype, &fsize); G_debug(3, "col: %s, kcols %d, pgtype : %d, gpgtype : %d, sqltype %d, fsize : %d", fname, kcols, pgtype, gpgtype, sqltype, fsize); /* PG types defined in globals.h (and pg_type.h) */ if (sqltype == DB_SQL_TYPE_UNKNOWN) { if (gpgtype == PG_TYPE_POSTGIS_GEOM) { G_warning(_("PostgreSQL driver: PostGIS column '%s', type 'geometry' " "will not be converted"), fname); continue; } else { /* Warn, ignore and continue */ G_warning(_("PostgreSQL driver: column '%s', type %d is not supported"), fname, pgtype); continue; } } if (gpgtype == PG_TYPE_INT8) G_warning(_("column '%s' : type int8 (bigint) is stored as integer (4 bytes) " "some data may be damaged"), fname); if (gpgtype == PG_TYPE_VARCHAR && fsize < 0) { G_warning(_("column '%s' : type character varying is stored as varchar(250) " "some data may be lost"), fname); fsize = 250; } if (gpgtype == PG_TYPE_BOOL) G_warning(_("column '%s' : type bool (boolean) is stored as char(1), values: 0 (false), " "1 (true)"), fname); column = db_get_table_column(*table, kcols); db_set_column_name(column, fname); db_set_column_length(column, fsize); db_set_column_host_type(column, gpgtype); db_set_column_sqltype(column, sqltype); /* TODO */ precision = 0; scale = 0; /* db_set_column_precision (column, precision); db_set_column_scale (column, scale); */ /* TODO */ db_set_column_null_allowed(column); db_set_column_has_undefined_default_value(column); db_unset_column_use_default_value(column); /* TODO */ /* db_set_column_select_priv_granted (column); db_set_column_update_priv_granted (column); db_set_column_update_priv_not_granted (column); */ if (c) { c->cols[kcols] = i; } kcols++; } return DB_OK; }
/* describe table, if c is not NULL cur->cols and cur->ncols is also set * cursor may be null */ int describe_table(OGRLayerH hLayer, dbTable ** table, cursor * c) { int i, ncols, kcols; dbColumn *column; OGRFeatureDefnH hFeatureDefn; OGRFieldDefnH hFieldDefn; const char *fieldName; int ogrType; int *cols; G_debug(3, "describe_table()"); hFeatureDefn = OGR_L_GetLayerDefn(hLayer); ncols = OGR_FD_GetFieldCount(hFeatureDefn); G_debug(3, "ncols = %d", ncols); /* Identify known columns */ cols = (int *)G_malloc(ncols * sizeof(int)); kcols = 0; for (i = 0; i < ncols; i++) { hFieldDefn = OGR_FD_GetFieldDefn(hFeatureDefn, i); ogrType = OGR_Fld_GetType(hFieldDefn); OGR_Fld_GetNameRef(hFieldDefn); fieldName = OGR_Fld_GetNameRef(hFieldDefn); if (ogrType != OFTInteger && ogrType != OFTReal && ogrType != OFTString && ogrType != OFTDate && ogrType != OFTTime && ogrType != OFTDateTime ) { G_warning(_("OGR driver: column '%s', OGR type %d is not supported"), fieldName, ogrType); cols[i] = 0; } else { cols[i] = 1; kcols++; } } if (!(*table = db_alloc_table(kcols))) { return DB_FAILED; } /* set the table name */ /* TODO */ db_set_table_name(*table, ""); /* set the table description */ db_set_table_description(*table, ""); /* TODO */ /* db_set_table_delete_priv_granted (*table); db_set_table_insert_priv_granted (*table); db_set_table_delete_priv_not_granted (*table); db_set_table_insert_priv_not_granted (*table); */ for (i = 0; i < ncols; i++) { int sqlType; int size, precision, scale; if (!(cols[i])) continue; /* unknown type */ hFieldDefn = OGR_FD_GetFieldDefn(hFeatureDefn, i); ogrType = OGR_Fld_GetType(hFieldDefn); fieldName = OGR_Fld_GetNameRef(hFieldDefn); G_debug(3, "field %d : ogrType = %d, name = %s", i, ogrType, fieldName); switch (ogrType) { case OFTInteger: sqlType = DB_SQL_TYPE_INTEGER; size = OGR_Fld_GetWidth(hFieldDefn); /* OK ? */ precision = 0; break; case OFTReal: sqlType = DB_SQL_TYPE_DOUBLE_PRECISION; size = OGR_Fld_GetWidth(hFieldDefn); /* OK ? */ precision = OGR_Fld_GetPrecision(hFieldDefn); break; case OFTString: case OFTDate: case OFTTime: case OFTDateTime: sqlType = DB_SQL_TYPE_CHARACTER; size = OGR_Fld_GetWidth(hFieldDefn); if (size == 0) { G_warning(_("column '%s', type 'string': unknown width -> stored as varchar(250) " "some data may be lost"), fieldName); size = 250; } precision = 0; break; default: G_warning(_("Unknown type")); break; } column = db_get_table_column(*table, i); db_set_column_host_type(column, ogrType); db_set_column_sqltype(column, sqlType); db_set_column_name(column, fieldName); db_set_column_length(column, size); db_set_column_precision(column, precision); /* TODO */ scale = 0; /* db_set_column_scale (column, scale); */ /* TODO */ db_set_column_null_allowed(column); db_set_column_has_undefined_default_value(column); db_unset_column_use_default_value(column); /* TODO */ /* db_set_column_select_priv_granted (column); db_set_column_update_priv_granted (column); db_set_column_update_priv_not_granted (column); */ } if (c) { c->cols = cols; c->ncols = ncols; } else { G_free(cols); } return DB_OK; }
/* describe table, if c is not NULL cur->cols and cur->ncols is also set */ int describe_table(MYSQL_RES * res, dbTable ** table, cursor * c) { int i, ncols, kcols; char *name; int sqltype, length; dbColumn *column; MYSQL_FIELD *fields; G_debug(3, "describe_table()"); ncols = mysql_num_fields(res); fields = mysql_fetch_fields(res); /* Count columns of known type */ kcols = 0; for (i = 0; i < ncols; i++) { field_info(&(fields[i]), &sqltype, &length); if (sqltype == DB_SQL_TYPE_UNKNOWN) continue; kcols++; /* known types */ } G_debug(3, "kcols = %d", kcols); if (!(*table = db_alloc_table(kcols))) { return DB_FAILED; } if (c) { c->ncols = kcols; c->cols = (int *)G_malloc(kcols * sizeof(int)); } db_set_table_name(*table, ""); db_set_table_description(*table, ""); /* Currently not used in GRASS */ /* db_set_table_delete_priv_granted (*table); db_set_table_insert_priv_granted (*table); db_set_table_delete_priv_not_granted (*table); db_set_table_insert_priv_not_granted (*table); */ kcols = 0; for (i = 0; i < ncols; i++) { name = fields[i].name; field_info(&(fields[i]), &sqltype, &length); G_debug(3, "col: %s, kcols %d, sqltype %d", name, kcols, sqltype); G_debug(3, "flags = %d", fields[i].flags); if (sqltype == DB_SQL_TYPE_UNKNOWN) { /* Print warning and continue */ G_warning(_("MySQL driver: column '%s', type %d " "is not supported"), name, fields[i].type); continue; } if (fields[i].type == MYSQL_TYPE_LONGLONG) G_warning(_("column '%s' : type BIGINT is stored as " "integer (4 bytes) some data may be damaged"), name); column = db_get_table_column(*table, kcols); db_set_column_name(column, name); db_set_column_length(column, length); db_set_column_host_type(column, (int)fields[i].type); db_set_column_sqltype(column, sqltype); db_set_column_precision(column, (int)fields[i].decimals); db_set_column_scale(column, 0); if (!(fields[i].flags & NOT_NULL_FLAG)) { db_set_column_null_allowed(column); } db_set_column_has_undefined_default_value(column); db_unset_column_use_default_value(column); /* Currently not used in GRASS */ /* db_set_column_select_priv_granted (column); db_set_column_update_priv_granted (column); db_set_column_update_priv_not_granted (column); */ if (c) { c->cols[kcols] = i; } kcols++; } return DB_OK; }