MySQL R7(+) - Cachefunktionen & Threaded Querys [UPDATED]

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Im Serverpack auf sa-mp.com ist kein Plugin enthalten im plugin Ordner, wird keins mehr mit R7 benötigt?


    Was meinst du damit genau ?


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • @GreenG:
    Danke, dass du mich darauf aufmerksam gemacht hast,
    das war ein Fehler, darf natürlich nicht in Anführungszeichen stehen.


    Ist geändert ...


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Hallo, ne frage.


    Ich will meine Vehicles laden.
    Bei den alten versionen war das ja so das man so gemacht hat um durch alle daten zu gehen.
    if(mysql_num_rows() > 0)
    {
    while(mysql_fetch_row(String))
    {


    Passiert das jetzt automatisch?
    Wenn ja müsset das dann ja so seon oder?

    stock LoadVehicles()
    {
    new query[128];
    format(query, sizeof(query), "SELECT * FROM `Vehicles` WHERE `VehicleType` = '%d'", -1);
    mysql_function_query(SQLHandle, query, true, "OnLoadVehicles", " ");
    }


    forward OnLoadVehicles();
    public OnLoadVehicles()
    {
    Vehicles[VehicleCounter][fvID] = cache_get_row_int(0, 0, SQLHandle);
    Vehicles[VehicleCounter][fvModel] = cache_get_row_int(0, 1, SQLHandle);
    Vehicles[VehicleCounter][fvX] = cache_get_row_float(0, 2, SQLHandle);
    Vehicles[VehicleCounter][fvY] = cache_get_row_float(0, 3, SQLHandle);
    Vehicles[VehicleCounter][fvZ] = cache_get_row_float(0, 4, SQLHandle);
    Vehicles[VehicleCounter][fvA] = cache_get_row_float(0, 5, SQLHandle);
    ...
    cache_get_row(0, 12, Vehicles[VehicleCounter][fvBesitzer], SQLHandle, MAX_PLAYER_NAME);
    ...
    VehicleCounter++
    }


    Danke für die hilfe.

    mfg
    Ali ;)

  • Dafür benötigst du eine schleife hab das auf der ersten Seite schon gepostet


    cache_get_data(rows, fields);
    new i;
    for(;i < rows;++i){
    cache_get_row(i, 0, ....);
    cache_get_row(i, 1, ....);
    }


    cache_get_row


    kannst du durch die neuen funktionen ersetzen du musst für den ersten parameter das i setzen dies ist für die einträge
    die werten mit dem query aus der datenbank herraus gefiltert


    //edit vergess nicht ein return 1; am ende zu setzen das signalisiert dem plugin cache leeren.


  • hatte ich mir schon gedacht,
    super danke dir

    mfg
    Ali ;)

  • Ich habe mal das Tutorial auf den aktuellen Stand der Dinge gebracht.
    Da bei der R8 2 neue Funktionen dazu gekommen sind, ist auch eine Erklärung dieser Funktionen im Tutorial vorzufinden.
    Die neuen Funktionen wurden entsprechend markiert.

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Danke dir! Super Tutorial :thumbup:


    Edit:


    Kleiner Fehler ;)
    So muss das aussehen bei der neuen Funktion mit Float:


    public ...... { //Das entsprechende Callback
    new Float:speicher;//Variable um die Gleitkommazahl zu speichern
    speicher = cache_get_row_float(0,5); //Holt uns die Daten von jetzt z.B 'LastX' (natürlich muss der Index wieder stimmen)
    printf("LastX-Koordinate: %f",speicher); //Ausgabe, aber dieses Mal ist keine Konvertierung nötig
    }

  • Blitz100
    Vielen Dank.
    Und auch danke dafür, dass du mich auf den Fehler aufmerksam gemacht hast, habe aus Versehen cache_get_row_int
    statt cache_get_row_float geschrieben.


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • grade erst bemerkt dass es so ein Tutorial gibt, werde damit wohl demnächst mein DT_DynamicCar updaten um den Leuten Mysql_strickenKid BluG R6 oder früher und R/ anzubieten.

  • grade erst bemerkt dass es so ein Tutorial gibt, werde damit wohl demnächst mein DT_DynamicCar updaten um den Leuten Mysql_strickenKid BluG R6 oder früher und R/ anzubieten.


    Freut mich natürlich, wenn dann jmd. auch auf diese "Methoden" bzw. threaded Querys "umsteigt",so dass eine effektivere Benutzung
    von MySQL möglich ist und man auch den MySQL Server (bzw. generell den SAMP Server) zu entlasten.


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • @L0g4n:
    Jemand ne idee, warum BluG's MYSQL Plugin R7 nicht den gesammten feldinhalt herausgibst.
    hier wie ich auslese:
    new Anzahl[128];
    cache_get_row(0, 3, Anzahl);
    print(Anzahl);


    hier der Inhalt des Feldes:
    1|1|1|1|1|1|1|1
    hier die Ausgabe:
    1|1

  • Also am Plugin kann es eigentlich nicht liegen, da eigentlich bei mir alles immer vollständig ausgegeben wird.
    Kann es sein, dass du eine neuere Version als R7 verwendest ?

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Gutes Tutorial, mir sind noch ein paar kleine Fehler aufgefallen:

    sscanf(store,"p<|>s[24]s[20],s[30]",pName,Fraktion,irgendeinstring)

    Da sollte kein Komma zwischen s[20] und s[30] sein.



    //Oberer Teil ist wieder weggelassen
    //Natürlich muss unten stehender Code in ein Callback
    new store[24];
    cache_get_field_content(0,"Name","store"); //Holen uns Daten aus "Name" und speichern in "store"
    printf("Name: %s",store); //Ausgeben des Wertes in der Konsole

    Da steht die Variable bei cache_get_field_content in Anführungszeichen.



    Verbesserungsvorschläge:

  • Edit:
    So ich habe mal noch ein paar Erklärungen zu den Funktionen hinzugefügt, die dazu gekommen sind (cache_get_row_int,cache_get_row_float,
    cache_get_field_content_int und cache_get_field_content_float).
    Ich habe die R20 (aktuelle Version) ausprobiert und diese funktioniert genauso gut, jedoch muss man bei den Cachefunktionen explizit manuell die
    max length angeben, sonst wird nämlich einfach nichts in eure Variablen geladen (Siehe dieser Post).
    maddinat0r: Ich kann leider nicht mehr cache_set_active,cache_save, etc. hinzufügen, da mein Post die maximale Länge eines Postes erreicht hat (20.000 Zeichen).
    Kann ein Moderator da man nicht irgendwas machen, das ich mehr Zeichen verwenden kann ?


    LG



    Kones: !
    @BlackAce: !
    maddin: !
    LeijaT: !

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

    2 Mal editiert, zuletzt von L0g4n ()

  • Also ich hab da eine Frage.
    Hier bei
    mysql_function_query(handle,"SELECT * From accounts",true,"LoadPlayers","");
    Bei SELECT Anfragen sollte ja der Cache auf true sein, das verstehe ich. Muss man dann immer einen Public angeben wie hier im Beispiel LoadPlayers ?

  • Also ich hab da eine Frage.
    Hier bei
    mysql_function_query(handle,"SELECT * From accounts",true,"LoadPlayers","");
    Bei SELECT Anfragen sollte ja der Cache auf true sein, das verstehe ich. Muss man dann immer einen Public angeben wie hier im Beispiel LoadPlayers ?


    Ja,denn r7 erlaubt nur noch die Threaded Methode.

    Zitat

    * = R7 (supports only threaded scripts)


    Erst wenn LoadPlayers() aufgerufen wurde, ist das Ergebnis der SQL Abfrage ( "SELECT * From accounts" ) fertig abgearbeitet.


    //Edit:

    Spoiler anzeigen
    Zugegeben,bei UPDATE macht es eher weniger Sinn dort eine public Funktion anzugeben.


    //Edit2:
    Damit ich nicht immer neue Funktionen anlegen muss,lass es es immer über OnQueryFinish verarbeitet.
    Ist bei r7 vorhanden:
    #define mysql_query(%1,%2,%3,%4) \
    mysql_function_query(%4, %1, false, "OnQueryFinish", "siii", %1, %2, %3, %4)

    Die Reihenfolge der Parameter muss entsprechend angepasst werden.