mySQL C API in xCode-Projekt einbinden

  • mySQL C API in xCode-Projekt einbinden

    Hallo,

    ich weiß, dass dieses Thema hier schon vielfach diskutiert wurde. Leider habe ich bisher noch nicht das Richtige gefunden.

    Ich möchte die mySQL-C-API direkt in mein Projekt einbinden und mit meinem restlichen Code kompilieren. Ich möchte es besonders deshalb so machen, um meinen Code auch in Zukunft für andere Architekturen kompilieren zu können. Apple wechselt ja schnell mal ;)
    Aktuell möchte ich mein Projekt für PPC, x86 und ARMx kompilieren können.

    Über ein kleines HowTo würde ich mich sehr freuen.

    Vielen Dank im Voraus,
    Andreas
    [url]http://www.isolute.de[/url]
  • Du musst die Lib hinzufügen. Einfach reinziehen (1 x Header, 1 x Kompilat).

    Aber was meinst du mit Architekturen wechseln!? Nichts von Cocoa ist nicht mitgegangen. Das Problem dürfte eher auftauchen, wenn du Third-Party-Libs verwendest.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Vielen Dank für die schnelle Antwort.

    Ich hatte bisher die Ordner 'include' und 'libmysql' in mein Projekt gezogen. Leider habe ich das Problem, dass ich anschließend massenhaft Fehler erhalte. Beginnend damit, dass scheinbar überall statt

    #include "my_global.h"

    immer

    #include

    zu finden ist (ein Beispiel von vielen). Allein dadurch stoppt der Compiler. Wenn ich alle '<' und '>' gegen " ersetze feht ihm noch die crypt.h und ulong kennt er nicht
    und und und -.-

    Gibt es hier einen grundsätzlichen Fehler, den ich gemacht habe?
    [url]http://www.isolute.de[/url]
  • Ich denke, dass in Objective-C in <*.h> stehende Dateien im System gesucht werden und in "*.h" stehende im Projektordner. Nach dem Tausch von <*.h> in "*.h" hat er ja auch nicht mehr gemeckert. Nur noch bei der
    #import "crypt.h"

    Das habe ich dreisterweise ersteinmal auskommentiert.

    Und dann waren da noch die 'ulong'.

    Ich habe das Projekt mal hochgeladen (als Dateianhang leider beim besten Willen zu groß :-/ :( iSolute.de/downloads/mySQL.zip

    Vielen vielen Dank für die Mühe !
    Andreas
    [url]http://www.isolute.de[/url]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von andreasprang ()

  • Eigentlich sollst Du eine Client-Library daraus bauen, libmysqlclient. Die bindest Du dann in Deine Projekte ein. Dann musst Du das auch nicht immer neu compilieren. Ausserdem ist die lib garantiert nicht darauf ausgelegt, "einfach so" kompiliert zu werden, da gibs sicher komplizierte Makefiles etc. so dass es schwierig wird, einfach die C-Dateien bei dir "reinzuziehen". Warum auch, dafür gibt es doch Libraries.

    Davon abgesehen bekommst Du so auch sicher Probleme mit der Lizenz, oder Du musst Deine Anwendung dann unter GPL veröffentlichen. Weiss ich aber nicht ganz genau. Muss ich auch nicht wissen, weil man sowas nicht machen sollte ;)
    C++
  • andreasprang schrieb:

    Ahja. Danke. Ich hab mir das etwas einfacher vorgestellt. Wie kann ich das für ARM-Archtektur kompilieren?

    So ist das doch der einfachste Weg?!
    Die Lib kompilierst Du Dir für was auch immer. Ich hab nicht so die Ahnung von iPhone/ARM, aber die Chancen stehen nicht schlecht, dass das sogar schon jemand gemacht hat. Fürs iPhone brauchst Du aber, soweit ich weiss, statische Libs. Steht in der Doku von mySQL nichts?

    EDIT:
    Du solltest mal wirklich Google benutzen. Da gibt es haufenweise fertige Lösungen für alles, was Du Dir vorstellen kannst. Du musst nur so abwägige Terme wie "MySQL Cocoa" oder "MySQL iPhone" eingeben. Kennst Du dies Google?
    C++
  • Ich schlage mich seit über einem Jahr mit diesem "Google" und mySQL rum !!!

    Bisher habe ich nur leider keine Lösung gefunden, die ich zum Laufen bekommen habe. Selbst mit diesem habe ich Probleme:
    eval-art.com/2009/06/22/mysqlframework-for-iphone/

    Das TestProjekt kompiliert wegen folgendem Fehler nicht:

    ld: warning: in /Users/andreasprang/Downloads/MySQL for iPhone/Device/MySQL.framework/MySQL, file was built for unsupported file format which is not the architecture being linked (i386)

    Ich habe noch andere Ansätze probiert, aber es bisher noch nicht geschafft -.-
    [url]http://www.isolute.de[/url]
  • andreasprang schrieb:

    Ich schlage mich seit über einem Jahr mit diesem "Google" und mySQL rum !!!

    Bisher habe ich nur leider keine Lösung gefunden, die ich zum Laufen bekommen habe. Selbst mit diesem habe ich Probleme:
    eval-art.com/2009/06/22/mysqlframework-for-iphone/

    Das TestProjekt kompiliert wegen folgendem Fehler nicht:

    ld: warning: in /Users/andreasprang/Downloads/MySQL for iPhone/Device/MySQL.framework/MySQL, file was built for unsupported file format which is not the architecture being linked (i386)

    Ich habe noch andere Ansätze probiert, aber es bisher noch nicht geschafft -.-

    Was ich noch überall gelesen habe: Warum willst Du von Deinem iPhone aus direkt auf eine MySQL Datenbank zugreifen? Wäre eine einheitliche Web-Schnittstelle nicht der bessere und einfachere Weg?
    Ganz zu schweigen davon, dass man eigentlich kein MySQL Server offen im Netz stehen haben will, damit jeder darauf zugreifen kann.

    Was willst Du überhaupt genau machen, vielleicht ist da auch schon das Problem ;) Ich kann mir auch nicht recht vorstellen, warum man MySQL in einer C-Anwendung, und dann noch auf einem mobilen Gerät benötigt. Ausser vielleicht irgendwelche Anwendungen für Grossunternehmen etc.

    Ich habe keine der Möglichkeiten ausprobiert. Wenn Du das aber schon gemacht hast, wäre es gut, wenn Du aufführst, was Du probiert hast und woran es gescheitert ist, dann kann man Dir sicherlich einfacher helfen.
    Entsprechend wäre eine "bessere" Frage in etwa: "Ich habe keine vorkompilierte MySQL Client Lib für das iPhone gefunden, brauche aber unbedingt MySQL Zugriff auf einen Server von mir. Ich habe versucht, die Lib selber zu kompilieren, das scheitert aber an XXX. Kann mir hier jemand etwas empfehlen? Ich bin auf direkten MySQL Zugriff angewiesen wegen YYY."
    C++
  • zerm schrieb:


    Ganz zu schweigen davon, dass man eigentlich kein MySQL Server offen im Netz stehen haben will, damit jeder darauf zugreifen kann.

    Was heißt denn 'offen'?
    MySQL hat ausgesprochen fein granulierte Sicherheitskonzepte auf Userebene.
    Ich sehe da kein Problem, jeweils die benötigten User mit den dazugehörigen Rechten hin und her zu melden.
    Im Allgemeinen macht man ja eh nicht alles in einer einzelnen Abfrage, also kann man auch die Sitzungen teilen.

    In einem Punkt hast du natürlich recht: man sollte schon wissen, was man tut.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich habe in den letzten Jahren an einem CMS für eine Firma geschrieben in der ich ehrenamtlich tätig bin (Berliner Parkeisenbahn gemeinnützige GmbH). Um ca. 80 ehrenamtlichen Mitarbeitern einen guten mobilen Zugriff auf das CMS zu bieten möchte ich eine App für das iPhone erstellen.

    Zunächst dachte ich daran meine Anfragen mit den in der DB gespeicherten Loindaten und RSA zu verschlüsseln (Kein SSL-Zertifikat vorhanden somit nutze ich kein https). Das habe ich bisher leider nicht geschafft. Ich bekomme die unter Objective-C verschlüsselten Daten unter PHP aber leider nicht entschlüsselt. Ich habe hierzu auch noch keinen anderen gefunden, der das Problem gelöst / veröffentlicht hat. :(

    Warum ich nun eine direkte Verbindung zur DB haben wollte ist natürlich der Komfort für die Anfragen. Die Verschlüsselung wollte ich hierbei später über eine VPN-Verbindung mit Zertifikat versuchen. *träum*

    Am liebsten wäre mir allerdings noch immer die RSA-Verschlüsselte Übertragung der Daten an PHP.

    ------------------------------------- iPhone (Objective-C)

    => Klartextanfrage
    => RSA-Verschlüsselung der Anfrage
    => in NSData umwandeln
    => Klartextübertragung der verschlüsselten Daten via HTTP-Request

    ------------------------------------- Server (PHP)

    => Anfrage entschlüsseln -> mySQL-Anfrage
    => Antwort asl Plist formatieren
    => Antwort RSA-verschlüsseln
    => Verschlüsselte Antwort als Antwort auf HTTP-Request senden

    ------------------------------------- iPhone (Objective-C)

    => Antwort entschlüsseln
    => Ergebnisse aus Plist verarbeiten
    [url]http://www.isolute.de[/url]
  • Lucas de Vil schrieb:

    zerm schrieb:


    Ganz zu schweigen davon, dass man eigentlich kein MySQL Server offen im Netz stehen haben will, damit jeder darauf zugreifen kann.

    Was heißt denn 'offen'?
    MySQL hat ausgesprochen fein granulierte Sicherheitskonzepte auf Userebene.
    Ich sehe da kein Problem, jeweils die benötigten User mit den dazugehörigen Rechten hin und her zu melden.
    Im Allgemeinen macht man ja eh nicht alles in einer einzelnen Abfrage, also kann man auch die Sitzungen teilen.

    In einem Punkt hast du natürlich recht: man sollte schon wissen, was man tut.

    Das ist eine Prinzipfrage. Als Server-Admin gibt man nichts heraus, was man nicht unbedingt muss, und das ganze hat rein gar nichts mit den Sicherheitskonzepten auf Userebene zu tun. Es braucht nur ein Sicherheitsloch in mysqld entdeckt werden, und jeder kann es sofort remote(!) ausnutzen, das ist nicht gut. Man möchte so wenig Angriffsfläche wie nur irgend möglich bieten, dadurch muss man auch nur auf wenige Komponenten achten - etwa nur darauf, dass der Apache aktuell ist, den MySQL kann man dann regulär updaten und muss nicht mitten in der Nacht ein Update reinspielen, weil ja jeder es remote ausnutzen könnte.
    Dazu kommt, dass man weitere Sicherheitskonzepte nur an einer Stelle umsetzen muss - bspw. kann so nur Apache geflooded werden und man weiss wie man damit umgeht. MySQL dagegen auch noch abzudichten ist eher sinnlos. Man macht es halt einfach in der Praxis nicht, weil so ziemlich rein gar nichts dafür spricht.

    andreasprang schrieb:


    Zunächst dachte ich daran meine Anfragen mit den in der DB gespeicherten Loindaten und RSA zu verschlüsseln (Kein SSL-Zertifikat vorhanden somit nutze ich kein https). Das habe ich bisher leider nicht geschafft. Ich bekomme die unter Objective-C verschlüsselten Daten unter PHP aber leider nicht entschlüsselt. Ich habe hierzu auch noch keinen anderen gefunden, der das Problem gelöst / veröffentlicht hat.

    SSL Zertifikate gibt es inzwischen kostenlos. Davon abgesehen bietet ein Self-Signed Zertifikat genau die gleiche Sicherheit - nur die Authentizität wird nicht geprüft, aber das wird sie ja in deiner Custom-Lösung natürlich auch nicht.
    Warum Du es in Deiner Custom-Lösung "nicht entschlüsselt" bekommst, kann ich Dir leider so nicht sagen, da gibt es aber viel, auf das man achten muss.

    andreasprang schrieb:


    Warum ich nun eine direkte Verbindung zur DB haben wollte ist natürlich der Komfort für die Anfragen. Die Verschlüsselung wollte ich hierbei später über eine VPN-Verbindung mit Zertifikat versuchen. *träum*

    Warum wird das ganze durch direkten SQL-Zugriff komfortabler? Wenn Du etwas am Datenbank-Layout änderst, musst Du an allen Clients extra auch Anpassungen vornehmen. Eine schöne API, welche das rohe SQL weg-abstrahiert ist hier (in meinen Augen) ganz klar Vorteilhaft.
    So oder so kannst Du aber ein PHP Skript schreiben, was SQL-Anfragen ausführt. Dann brauchst Du nirgendwo sonst ein SQL-Client. Schön finde ich das aber immer noch nicht, aber darum geht es ja wahrscheinlich auch nicht.

    Nachtrag:
    Informiere Dich vorher noch einmal, wie man das mit der Verschlüsselung überhaupt macht. Kein Mensch verschlüsselt tatsächliche Inhalte mit RSA und das hat vielerlei Gründe.
    C++
  • Hi,

    ich habe deinen Rat noch einmal aufgegriffen und habe versucht eine API zu erstellen und die Anfragen über https zu leiten. Damit habe ich zwar noch immer die Gefahr der "man in the middle" Attacken, aber insgesamt ist die Sicherheit schon recht hoch.

    Hast du eine Idee, warum die folgende Methode nur über http und nicht über https funktioniert?

    Quellcode

    1. - (NSData *) mySQLrequest:(NSString *)query withName:(NSString *)name andPassword:(NSString *)pass {
    2. NSString *url = @"http://domain.de/API/mySQlrequest.php"; // FUNKTIONIERT
    3. // NSString *url = @"https://domain.de/API/mySQlrequest.php"; // FUNKTIONIERT NICHT
    4. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
    5. NSMutableString *post = [[[NSMutableString alloc]init]autorelease];
    6. [post appendString:@"HASH=e58fea9ba9f2426767854a78b6e8"];
    7. [post appendString:[@"&Query=" stringByAppendingString:query]];
    8. [post appendString:[@"&User=" stringByAppendingString:name]];
    9. [post appendString:[@"&Pass=" stringByAppendingString:pass]];
    10. NSURLResponse *resp = nil;
    11. NSError *err = nil;
    12. [request setHTTPMethod:@"POST"];
    13. NSData *postData = [post dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:NO];
    14. [request setHTTPBody:postData];
    15. NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&resp error:&err];
    16. return result;
    17. }
    Alles anzeigen
    [url]http://www.isolute.de[/url]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von andreasprang ()

  • Ich habe eine unschöne Lösung gefunden. Mit der folgenden Zeile Code funktioniert die Anfrage auch mit https:

    Quellcode

    1. [NSMutableURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[[NSURL URLWithString:url] host]];




    Der üble Beigeschmack kommt allerdings erst, wenn man daran denkt, dass dies eine private API ist. Somit sollte es massive Probleme beim Einreichen des Programms bei Apple geben -.-


    Das Problem ist also noch immer nicht zufriedenstellend gelöst :(
    [url]http://www.isolute.de[/url]
  • Das Problem kenne ich, verschlüsseln und auf der PHP-Seite entschlüsseln, ich hab das dann mit Blowfish gelöst, funktionierte einwandfrei (allerdings war das nicht fürs Telefon)
  • wolf_10de schrieb:

    Das Problem kenne ich, verschlüsseln und auf der PHP-Seite entschlüsseln, ich hab das dann mit Blowfish gelöst, funktionierte einwandfrei (allerdings war das nicht fürs Telefon)
    Hi Wolfgang,

    das klingt ja genau nach den, was ich gesucht habe ;)

    Kannst du mir die wichtigsten Objective-C Methoden und PHP Funktionen zur Verfügung stellen?


    Schonmal vielen vielen Dank für die Hilfe !
    [url]http://www.isolute.de[/url]