whole_func_string: function (connectionName, table, cb) {
              if (LOG_DEBUG) {
                  console.log("BEGIN describe");
              }
              var connectionObject = connections[connectionName];
              var collection = connectionObject.collections[table];
  
              if (!collection) {
                  return cb(util.format('Unknown collection `%s` in connection `%s`', collectionName, connectionName));
              }
  
              var queries = [];
              queries[0] = "SELECT COLUMN_NAME, DATA_TYPE, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '" + table + "'";
              queries[1] = "SELECT index_name,COLUMN_NAME FROM user_ind_columns WHERE table_name = '" + table + "'";
              queries[2] = "SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner "
                      + "FROM all_constraints cons, all_cons_columns cols WHERE cols.table_name = '" + table
                      + "' AND cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner "
                      + "ORDER BY cols.table_name, cols.position";
  
              
              // Run Query
              connectionObject.pool.getConnection(
                      function (err, connection)
                      {
                          if (err) {
                              handleQueryError(err, 'describe');
                              return;
                          }
                          if (LOG_QUERIES) {
                              console.log('Executing query: ' + queries[0]);
                          }
                          connection.execute(queries[0], {}, {outFormat: oracledb.OBJECT}, function __SCHEMA__(err, result) {
  
                              if (err) {
                                  /* Release the connection back to the connection pool */
                                  doRelease(connection);
                                  return cb(handleQueryError(err, 'describe'));
                              }
  
                              var schema = result.rows;
                              if (LOG_QUERIES) {
                                  console.log('Executing query: ' + queries[1]);
                              }
                              connection.execute(queries[1], {}, {outFormat: oracledb.OBJECT}, function __DEFINE__(err, result) {
  
                                  if (err) {
                                      /* Release the connection back to the connection pool */
                                      doRelease(connection);
                                      return cb(handleQueryError(err, 'describe'));
                                  }
  
                                  var indexes = result.rows;
  
                                  if (LOG_QUERIES) {
                                      console.log('Executing query: ' + queries[2]);
                                  }
                                  connection.execute(queries[2], {}, {outFormat: oracledb.OBJECT}, function __DEFINE__(err, result) {
  
                                      if (err) {
                                          /* Release the connection back to the connection pool */
                                          doRelease(connection);
                                          return cb(handleQueryError(err, 'describe'));
                                      }
  
                                      var tablePrimaryKeys = result.rows;
                                      if (schema.length === 0) {
                                          doRelease(connection);
                                          return cb();
                                      }
  
                                      // Loop through Schema and attach extra attributes
                                      schema.forEach(function (attribute) {
                                          tablePrimaryKeys.forEach(function (pk) {
                                              // Set Primary Key Attribute
                                              if (attribute.COLUMN_NAME === pk.COLUMN_NAME) {
                                                  attribute.primaryKey = true;
                                                  // If also a number set auto increment attribute
                                                  if (attribute.DATA_TYPE === 'NUMBER') {
                                                      attribute.autoIncrement = true;
                                                  }
                                              }
                                          });
                                          // Set Unique Attribute
                                          if (attribute.NULLABLE === 'N') {
                                              attribute.required = true;
                                          }
  
                                      });
                                      // Loop Through Indexes and Add Properties
                                      indexes.forEach(function (index) {
                                          schema.forEach(function (attribute) {
                                              if (attribute.COLUMN_NAME === index.COLUMN_NAME)
                                              {
                                                  attribute.indexed = true;
                                              }
                                          });
                                      });
                                      // Convert mysql format to standard javascript object
  
                                      //var normalizedSchema = sql.normalizeSchema(schema, collection.attributes);
                                      // Set Internal Schema Mapping
                                      //collection.schema = normalizedSchema;
  
                                      /* Release the connection back to the connection pool */
                                      doRelease(connection);
                                      // TODO: check that what was returned actually matches the cache
                                      cb(null, schema);
  
                                  });
  
                              });
  
                          });
                      });
  
          }
func_code_string: function (connectionName, table, cb) {
              if (LOG_DEBUG) {
                  console.log("BEGIN describe");
              }
              var connectionObject = connections[connectionName];
              var collection = connectionObject.collections[table];
  
              if (!collection) {
                  return cb(util.format('Unknown collection `%s` in connection `%s`', collectionName, connectionName));
              }
  
              var queries = [];
              queries[0] = "SELECT COLUMN_NAME, DATA_TYPE, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '" + table + "'";
              queries[1] = "SELECT index_name,COLUMN_NAME FROM user_ind_columns WHERE table_name = '" + table + "'";
              queries[2] = "SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner "
                      + "FROM all_constraints cons, all_cons_columns cols WHERE cols.table_name = '" + table
                      + "' AND cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner "
                      + "ORDER BY cols.table_name, cols.position";
  
              
              // Run Query
              connectionObject.pool.getConnection(
                      function (err, connection)
                      {
                          if (err) {
                              handleQueryError(err, 'describe');
                              return;
                          }
                          if (LOG_QUERIES) {
                              console.log('Executing query: ' + queries[0]);
                          }
                          connection.execute(queries[0], {}, {outFormat: oracledb.OBJECT}, function __SCHEMA__(err, result) {
  
                              if (err) {
                                  /* Release the connection back to the connection pool */
                                  doRelease(connection);
                                  return cb(handleQueryError(err, 'describe'));
                              }
  
                              var schema = result.rows;
                              if (LOG_QUERIES) {
                                  console.log('Executing query: ' + queries[1]);
                              }
                              connection.execute(queries[1], {}, {outFormat: oracledb.OBJECT}, function __DEFINE__(err, result) {
  
                                  if (err) {
                                      /* Release the connection back to the connection pool */
                                      doRelease(connection);
                                      return cb(handleQueryError(err, 'describe'));
                                  }
  
                                  var indexes = result.rows;
  
                                  if (LOG_QUERIES) {
                                      console.log('Executing query: ' + queries[2]);
                                  }
                                  connection.execute(queries[2], {}, {outFormat: oracledb.OBJECT}, function __DEFINE__(err, result) {
  
                                      if (err) {
                                          /* Release the connection back to the connection pool */
                                          doRelease(connection);
                                          return cb(handleQueryError(err, 'describe'));
                                      }
  
                                      var tablePrimaryKeys = result.rows;
                                      if (schema.length === 0) {
                                          doRelease(connection);
                                          return cb();
                                      }
  
                                      // Loop through Schema and attach extra attributes
                                      schema.forEach(function (attribute) {
                                          tablePrimaryKeys.forEach(function (pk) {
                                              // Set Primary Key Attribute
                                              if (attribute.COLUMN_NAME === pk.COLUMN_NAME) {
                                                  attribute.primaryKey = true;
                                                  // If also a number set auto increment attribute
                                                  if (attribute.DATA_TYPE === 'NUMBER') {
                                                      attribute.autoIncrement = true;
                                                  }
                                              }
                                          });
                                          // Set Unique Attribute
                                          if (attribute.NULLABLE === 'N') {
                                              attribute.required = true;
                                          }
  
                                      });
                                      // Loop Through Indexes and Add Properties
                                      indexes.forEach(function (index) {
                                          schema.forEach(function (attribute) {
                                              if (attribute.COLUMN_NAME === index.COLUMN_NAME)
                                              {
                                                  attribute.indexed = true;
                                              }
                                          });
                                      });
                                      // Convert mysql format to standard javascript object
  
                                      //var normalizedSchema = sql.normalizeSchema(schema, collection.attributes);
                                      // Set Internal Schema Mapping
                                      //collection.schema = normalizedSchema;
  
                                      /* Release the connection back to the connection pool */
                                      doRelease(connection);
                                      // TODO: check that what was returned actually matches the cache
                                      cb(null, schema);
  
                                  });
  
                              });
  
                          });
                      });
  
          }
func_documentation_string: Return attributes - OK