private static function _loadColumns()
    {
        if (!self::resolveConnection()) {
            return;
        }

        $cls = get_called_class();
        self::$_columns[$cls] = array();

        $escape = Driver::$escape_char;

        // try to create the TORM info table
        $type = Driver::$numeric_column;

        // check if the torm table exists
        $rst   = null;
        $check = false;
        try {
            $rst   = self::query("select id from torm_info");
            $check = true;
        } catch (\Exception $e) {
        }

        // needs to create table
        if (!$check || !is_object($rst) || !$rst->fetch()) {
            $stmt = self::query("create table torm_info (id $type(1))");
            self::closeCursor($stmt);
        }
        if (is_object($rst)) {
            self::closeCursor($rst);
        }

        // insert first value
        $rst = self::query("select id from torm_info");
        if (!$rst->fetch()) {
            $stmt = self::query("insert into torm_info values (1)");
            self::closeCursor($stmt);
        }
        self::closeCursor($rst);

        // hack to dont need a query string to get columns
        $sql  = "select $escape".self::getTableName()."$escape.* from torm_info left outer join $escape".self::getTableName()."$escape on 1=1";
        $rst  = self::query($sql);
        $keys = array_keys($rst->fetch(\PDO::FETCH_ASSOC));

        foreach ($keys as $key) {
            $keyc = self::isIgnoringCase() ? strtolower($key) : $key;
            array_push(self::$_columns[$cls], $keyc);
            self::$_mapping[$cls][$keyc] = $key;
        }
        self::closeCursor($rst);
        self::$_loaded[$cls] = true;
    }