function _getRecords_loadResults($query, $options, $schema)
{
    // execute query
    $result = mysql_query($query) or die(@$VIEWER_NAME . " MySQL Error: " . htmlencode(mysql_error()) . "\n");
    $records = array();
    while ($record = mysql_fetch_assoc($result)) {
        $filenameValue = getFilenameFieldValue($record, @$schema['_filenameFields']);
        $record['_filename'] = rtrim($filenameValue, '-');
        if (@(!$schema['_detailPage'])) {
            $record['_link'] = "javascript:alert('Set Detail Page Url for this section in: Admin > Section Editors > Viewer Urls')";
        } elseif (@$options['useSeoUrls']) {
            $record['_link'] = PREFIX_URL . @$schema['_detailPage'] . '/' . $filenameValue . $record['num'] . "/";
        } else {
            $record['_link'] = PREFIX_URL . @$schema['_detailPage'] . '?' . $filenameValue . $record['num'];
        }
        $record['_link'] = str_replace(' ', '%20', $record['_link']);
        // v2.60 : urlencode spaces so they validate
        // allow _detailPage links of / or ? // NOT YET IMPLEMENTED
        #$record['_link'] = preg_replace("/\?+/", '?', $record['_link']);
        #$record['_link'] = preg_replace("/\/+/", '/', $record['_link']);
        //
        array_push($records, $record);
    }
    if (is_resource($result)) {
        mysql_free_result($result);
    }
    // get record count
    $totalRecords = (int) mysql_select_found_rows();
    //
    $results = array($records, $totalRecords);
    return $results;
}
function getRecord($options)
{
    global $VIEWER_NAME, $TABLE_PREFIX;
    $VIEWER_NAME = "Page Viewer ({$options['tableName']})";
    // error checking
    $requiredOptions = array('tableName');
    $validOptions = array('tableName', 'recordNum', 'where', 'titleField', 'orderBy');
    $errors = _getOptionErrors($requiredOptions, $validOptions, $options);
    if ($errors) {
        die("{$VIEWER_NAME} errors<br/>\n{$errors}");
    }
    // set defaults
    $schema = loadSchema($options['tableName']);
    if (!@$options['recordNum']) {
        $options['recordNum'] = getLastNumberInUrl();
    }
    if (@$schema['menuType'] == 'single') {
        $options['recordNum'] = "1";
    }
    // always load record 1 for single menus
    // get where condition
    $whereConditions = '';
    $escapedRecordNum = mysql_escape((int) $options['recordNum']);
    if ($options['where']) {
        $whereConditions = $options['where'];
    } elseif ($options['recordNum']) {
        $whereConditions = "num = '{$escapedRecordNum}'";
    }
    // get record
    $fullTableName = getTableNameWithPrefix($options['tableName']);
    $escapedTableName = mysql_escape($fullTableName);
    $where = _addWhereConditionsForSpecialFields($schema, $whereConditions, $options);
    $orderBy = @$options['orderBy'] ? "ORDER BY {$options['orderBy']}" : '';
    $query = "SELECT * FROM `{$escapedTableName}` {$where} {$orderBy} LIMIT 0, 1";
    $result = mysql_query($query) or die("{$VIEWER_NAME}: MySQL Error: " . htmlencode(mysql_error()) . "\n");
    $record = mysql_fetch_assoc($result);
    // add _link field
    if ($record) {
        $filenameValue = getFilenameFieldValue($record, @$options['titleField']);
        $record['_link'] = _getLink($_SERVER['SCRIPT_NAME'], $filenameValue, $record['num'], @$options['useSeoUrls']);
    }
    // define upload fields
    if ($record) {
        foreach ($schema as $fieldname => $fieldSchema) {
            if (!is_array($fieldSchema)) {
                continue;
            }
            // not a field definition, table metadata field
            if (@$fieldSchema['type'] != 'upload') {
                continue;
            }
            // skip all but upload fields
            $record[$fieldname] = "Use getUploads() function to list uploads (See code generator).\n";
        }
    }
    //
    return $record;
}