JeuWeb - Crée ton jeu par navigateur
[MySQL] Besoin d'aide pour Procedure stocke - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [MySQL] Besoin d'aide pour Procedure stocke (/showthread.php?tid=6581)



[MySQL] Besoin d'aide pour Procedure stocke - Talus - 16-05-2014

bonjour a tous

je suis en train de travailler sur le marcher Galactique de mon jeu. le système fonctionne en offre et demande (un peu comme la bourse).

mais je bloque au niveau de la procédure stockée, permettant de réaliser les échanges, faut dire c'est pas mon truc ^^

voici comment c'est organisée :

j'ai 2 table pour le marcher

- la première qui permet de visualiser les offre en cour, que ce soit pour de la vente ou de l'achat
Code :
CREATE TABLE IF NOT EXISTS `gametradeoffer` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `owner` int(11) unsigned NOT NULL,
  `type` enum('sell','buy') NOT NULL,
  `ressource` int(11) NOT NULL,
  `quantity` double(50,0) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `owner` (`owner`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;

- la seconde qui permet de visualiser les echange effectuer
Code :
CREATE TABLE IF NOT EXISTS `gametradehistory` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `seller` int(11) unsigned NOT NULL,
  `buyer` int(11) unsigned NOT NULL,
  `timestamp` datetime NOT NULL,
  `ressource` int(11) NOT NULL,
  `quantity` double NOT NULL,
  `price` decimal(10,3) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `buyer` (`buyer`),
  KEY `seller` (`seller`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

dans ces 2 table "price" est le prix unitaire de vente

quand un joueur décide de vendre ou d'acheter , il émet une offre, celle-ci est enregistrée dans gametradeoffer, ensuite la procédure stockée est exécutée affin de vérifier les offre en cour, affin de les satisfaire.

Le système fonctionne, en premier arrivée premier servie :
par exemple si un joueur décide d'acheter 2000unitee de métal a 2.2credit, ce sera la première offre de vente de métal a 2.2 qui servira a satisfaire l'achat.

les offre sont cumulative :
un joueur décide d'acheter 2000u de métal a 2.2
un joueur vend 500u de métal a 2.2 (id = 1)
un joueur vend 3000u de métal a 2.2 (id = 2)

la transaction sera satisfaite par 2 joueur, mais le dernier arriver aura sont offre de modifier affin de changer la quantité en vente
si une offre n'est pas entièrement satisfaite elle est donc modifier en fonction de ce qui a été acheter ou vendu


voila pour la description du fonctionnement

j'ai commencer a écrire un début de procédure stockée, mais j'aurai besoin d'un peu, beaucoup d'aide pour la finaliser :

Code :
DELIMITER $$

DROP PROCEDURE IF EXISTS `checkTradeOffer` $$
DROP PROCEDURE IF EXISTS `sellOfferFirst` $$
DROP PROCEDURE IF EXISTS `BuyOfferFirst` $$

CREATE PROCEDURE sellOfferFirst()
BEGIN
    DECLARE sellerID INTEGER;
    DECLARE ressource INTEGER;
    DECLARE quantity DOUBLE;
    DECLARE rate DECIMAL;

    DEClARE sellOfferCursor CURSOR FOR
        SELECT owner, ressource, quantity, price AS rate FROM gametradeoffer WHERE `type` = 'sell';
    OPEN sellOfferCursor;

    get_sellOffer: LOOP
        FETCH sellOfferCursor INTO sellerID, ressource, quantity, rate;
    
        
    END LOOP get_sellOffer;

    CLOSE sellOfferCursor;
END $$

CREATE PROCEDURE BuyOfferFirst()
BEGIN
    DECLARE sellerID INTEGER;
    DECLARE ressource INTEGER;
    DECLARE quantity DOUBLE;
    DEClARE buyOfferCursor CURSOR FOR
        SELECT owner, ressource, quantity, price FROM gametradeoffer WHERE `type` = 'buy';
    OPEN buyOfferCursor;

    get_buyOffer: LOOP
        FETCH buyOfferCursor INTO sellerID, ressource, quantity, rate;
    
        
    END LOOP get_buyOffer;

    CLOSE buyOfferCursor;
END $$

CREATE PROCEDURE checkTradeOffer()
BEGIN
    DECLARE nbBuy INTEGER DEFAULT 0;
    DECLARE nbSell INTEGER DEFAULT 0;
    
    SELECT COUNT(*) AS counts INTO @nbBuy FROM gametradeoffer WHERE `type` = 'buy';
    SELECT COUNT(*) AS counts INTO @nbSell FROM gametradeoffer WHERE `type` = 'sell';

    IF (nbSell < nbBuy) THEN
        CALL sellOfferFirst();
    END IF;
    
    IF (nbSell > nbBuy) THEN
        CALL BuyOfferFirst();
    END IF;    
END $$

DELIMITER ;



RE: [MySQL] Besoin d'aide pour Procedure stocke - niahoo - 16-05-2014

Bon je sais que c'est pas ce que tu attends comme réponse mais moi je ferais plutôt ça dans une transaction côté code serveur plutôt que dans une procédure.