Ticket #2170: mysql_as_string.patch

File mysql_as_string.patch, 5.6 KB (added by NotFound, 3 years ago)
  • examples/Mysql.winxed

    diff --git a/examples/Mysql.winxed b/examples/Mysql.winxed
    index cc389a3..436ba83 100644
    a b  
    4343 
    4444function str_to_cstring(string s) 
    4545{ 
    46     var to_cstring = dlfunc(null, 'Parrot_str_to_cstring',   'ppS'); 
    47     return to_cstring(getinterp(), s); 
    48 } 
    49  
    50 function str_free_cstring(s) 
    51 { 
    52     var free_cstring = dlfunc(null, 'Parrot_str_free_cstring', 'vp'); 
    53     free_cstring(s); 
     46    var cstring = new ['ByteBuffer']; 
     47    cstring =: s; 
     48    push(cstring, 0); 
     49    return cstring; 
    5450} 
    5551 
    5652function get_parrot_func(string name, string sig) 
     
    7268    return found; 
    7369} 
    7470 
    75 function raw_encode(string s, string encoding) 
    76 { 
    77     int got_encoding_num; 
    78     string got_encoding; 
    79     ${ encoding got_encoding_num, s }; 
    80     ${ encodingname got_encoding, got_encoding_num }; 
    81     if (got_encoding != encoding) { 
    82         switch { 
    83           case got_encoding == 'ascii' && encoding == 'iso-8859-1': 
    84           case got_encoding == 'ascii' && encoding == 'utf8': 
    85             // Compatible encodings, do nothing 
    86             break; 
    87           default: 
    88             // trans_encoding is not useful here, must encode 
    89             // from the raw bytes. 
    90             var b = new ['ByteBuffer']; 
    91             b =: s; 
    92             s = b.get_string(encoding); 
    93         } 
    94     } 
    95     return s; 
    96 } 
    97  
    98 function get_encoding_func() 
    99 { 
    100     var found; 
    101  
    102     found = get_parrot_func('Parrot_str_from_platform_cstring', 'Spp'); 
    103     if (found != null) { 
    104         return function(p, string encoding[optional]) 
    105         { 
    106             var interp = getinterp(); 
    107             return found(interp, p); 
    108         }; 
    109     } 
    110  
    111     found = get_parrot_func('Parrot_str_new', 'SppI'); 
    112     if (found != null) { 
    113         return function(p, string encoding[optional]) 
    114         { 
    115             var interp = getinterp(); 
    116             return found(interp, p, 0); 
    117         }; 
    118     } 
    119     return null; 
    120 } 
    121  
    122 function string_from_nci(p, string encoding[optional]) 
    123 { 
    124     var interp = getinterp(); 
    125  
    126     var f = get_encoding_func(); 
    127     if (! f) 
    128         throw "Cannot get string from NCI"; 
    129  
    130     string s; 
    131     if (f != null) 
    132         s = f(p, encoding); 
    133  
    134     if (s != null && encoding != null) 
    135         s = raw_encode(s, encoding); 
    136     return s; 
    137 } 
    138  
    13971} // namespace __private; 
    14072 
    14173using namespace __private; 
     
    14375class Row 
    14476{ 
    14577    var mrow; 
     78    var desc; 
    14679    var nfields; 
    14780    var encoding; 
    148     function Row(var myrow, int n, string encoding[optional]) 
     81    function Row(var myrow, var desc, int n, string encoding[optional]) 
    14982    { 
    15083        self.mrow = myrow; 
     84        self.desc = desc; 
    15185        self.nfields = n; 
    15286        if (encoding != null) 
    15387            self.encoding = encoding; 
    15488    } 
    15589    function get(int i) 
    15690    { 
    157         string s = self.mrow[i]; 
    158         if (s != null && self.encoding != null) 
    159             s = raw_encode(s, self.encoding); 
    160         return s; 
     91        string encoding; 
     92        if (self.encoding != null) 
     93            encoding = self.encoding; 
     94        var p = self.desc[self.mrow, 0, i]; 
     95        string result; 
     96        if (p != null) { 
     97            result = p.as_string(encoding); 
     98        } 
     99        else 
     100            result = ''; 
     101        return result; 
    161102    } 
    162103} 
    163104 
     
    175116        var f = dlfunc(getlib(), 'mysql_field_count', 'ip'); 
    176117        int count = f(my.mysql); 
    177118        self.nfields = count; 
    178         int desc [3 * count]; 
    179         // Store the fields description for use in fetchs. 
    180         for (int i = 0; i < count; ++i) { 
    181             desc[i * 3]     = DATATYPE_CSTR; 
    182             desc[i * 3 + 1] = 1; 
    183             desc[i * 3 + 2] = 0; 
    184         } 
     119        var desc = new ['StructView'] ( [DATATYPE_STRUCT, 1, 
     120                DATATYPE_PTR, count 
     121            ] 
     122        ); 
    185123        self.desc = desc; 
    186124    } 
    187125    function field_count() 
     
    200138        if (frow == none) 
    201139            return null; 
    202140 
    203         frow =: self.desc; 
    204141        string encoding; 
    205142        if (self.mysql.encoding != null) 
    206143            encoding = self.mysql.encoding; 
    207         return new WinxedMysql.Row(frow, self.nfields, encoding); 
     144        return new WinxedMysql.Row(frow, self.desc, self.nfields, encoding); 
    208145    } 
    209146    function close() 
    210147    { 
     
    243180    { 
    244181        using WinxedMysql.getlib; 
    245182        var f = dlfunc(getlib(), 'mysql_get_client_info', 'p'); 
    246         return string_from_nci(f(), 'utf8'); 
     183        return f().as_string('utf8'); 
    247184    } 
    248185    function error() 
    249186    { 
    250187        using WinxedMysql.getlib; 
    251188        var f = dlfunc(getlib(), 'mysql_error', 'pp'); 
    252         return string_from_nci(f(self.mysql)); 
     189        return f(self.mysql).as_string('utf8'); 
    253190    } 
    254191    function connect(string host, string user, string pass, string database, 
    255192            string encoding) 
     
    262199        var ppass = str_to_cstring(pass); 
    263200        var pdatabase = str_to_cstring(database); 
    264201        var p = f(self.mysql, phost, puser, ppass, pdatabase, 0, null, 0); 
    265         str_free_cstring(phost); 
    266         str_free_cstring(puser); 
    267         str_free_cstring(ppass); 
    268         str_free_cstring(pdatabase); 
    269202        if (p == null) 
    270203            throw Error(self.error(), ERROR, TYPE); 
    271204        var none = new 'UnManagedStruct'; 
     
    287220        var f = dlfunc(getlib(), 'mysql_query', 'ipp'); 
    288221        var pstmt = str_to_cstring(stmt); 
    289222        int q = f(self.mysql, pstmt); 
    290         str_free_cstring(pstmt); 
    291223        if (q != 0) 
    292224            throw Error(self.error(), ERROR, TYPE); 
    293225    }