It uses an integer type, or tiny int if you will not be using many types.
The bitwise operations don't need any specific type. If you want more info
there is a nice little tutorial at
http://www.litfuel.net/tutorials/bitwise.htm . That should explain better.
Perhaps another small example here would help. This is directly from our
code, from a batch script that does not use symfony to transfer
classifications from the old "column per classification" schema of the old
system mentioned in my blog post to the new schema using binary:

$classification_value = 0;

$classification_value = $get_batch_result->fields['isspam'] == 1 ?
$classification_value + 1 : $classification_value;

$classification_value = $get_batch_result->fields['ishighspam'] == 1 ?
$classification_value + 2 : $classification_value;

$classification_value = $get_batch_result->fields['issaspam'] == 1 ?
$classification_value + 4 : $classification_value;

$classification_value = $get_batch_result->fields['isrblspam'] == 1 ?
$classification_value + 8 : $classification_value;

$classification_value = $get_batch_result->fields['isfp'] == 1 ?
$classification_value + 16 : $classification_value;

$classification_value = $get_batch_result->fields['spamwhitelisted'] == 1 ?
$classification_value + 32 : $classification_value;

$classification_value = $get_batch_result->fields['spamblacklisted'] == 1 ?
$classification_value + 64 : $classification_value;

 $classification_value = $get_batch_result->fields['virusinfected'] == 1 ?
$classification_value + 128 : $classification_value;

$classification_value = $get_batch_result->fields['nameinfected'] == 1 ?
$classification_value + 256 : $classification_value;

$classification_value = $get_batch_result->fields['otherinfected'] == 1 ?
$classification_value + 512 : $classification_value;

$classification_value = $get_batch_result->fields['quarantined'] == 1 ?
$classification_value + 1024 : $classification_value;

The reason it works is because in PHP you can take a value from the
classification and do a bitwise if:

if ($classification_value & 512)

So if the classification value had 512 (otherinfected) added onto it the
result would be true. Another example is if I had a classification value of
768:

if ($classification_value & 512)

would still return true as well as:

if ($classification_value & 256)

and nothing else would because 512 + 256 = 768.

Hope that helps a bit more

On Thu, Apr 30, 2009 at 1:47 AM, Richtermeister <[email protected]> wrote:

>
> Hi Gareth,
>
> thanks for the explanation. The part about the 1, 2, 4, 8 step I get..
> but to me those would still be integers.. albeit not continuous.
> I guess I am just not familiar with the bit datatype and how it is
> used.
>
> If you don't mind me asking, what database storage type does this use?
>
> Thanks,
> Daniel
>
>
> On Apr 29, 2:38 pm, Gareth McCumskey <[email protected]> wrote:
> > If you used just integers then you wouldn't be able to work backwards
> from
> > the totalled number. For example:
> >
> > - is_low_socring = 1
> > - is_high_scoring = 2
> > - is_virus = 3
> > - is_badcontent = 4
> >
> > If I had something that was just bad content it would be a 4. But If I
> had
> > something that was low_scoring and a virus it would also be 4... hmmm.
> But
> > if I use binary...
> >
> > - is_low_socring = 1
> > - is_high_scoring = 2
> > - is_virus = 4
> > - is_badcontent = 8
> >
> > ONLY bad_content can be an 8, only low_scoring AND virus can be a 5 ..
> etc
> > etc.
> >
> > Hope that helps
> >
> >
> >
> > On Wed, Apr 29, 2009 at 6:01 PM, Richtermeister <[email protected]>
> wrote:
> >
> > > Hi Gareth,
> >
> > > I just read your blog entry on that subject, and I have to admit that
> > > it never occurred to me to use bits to store multiple flags in one
> > > column. I like it! :) Thanks.
> >
> > > My question, if I may, is why the classification column is not just an
> > > integer? What is the Criteria::BINARY_AND for?
> >
> > > Thanks for enlightening me :)
> > > Have a great day.
> > > Daniel
> >
> > > On Apr 29, 1:09 am, Gareth McCumskey <[email protected]> wrote:
> > > > Hi all,
> >
> > > > I need the great minds that populate this liust to assist me with a
> small
> > > > dilema. We currently use an integer field that stores a range of
> values
> > > as a
> > > > bitwise number depending on certain criteria of an item stored in the
> db.
> > > > What we want to do now is write a sql query like:
> >
> > > > SELECT [columns] FROM [tablename] WHERE classification & 1 AND
> > > > classification & ~2
> >
> > > > I am struggling to find the negation (~) operator as part of the
> criteria
> > > > syntax. So far I have:
> >
> > > > $status_criterion =
> $c->getNewCriterion(MailDetailsPeer::CLASSIFICATION,
> > > 1,
> > > > Criteria::BINARY_AND);
> >
> > >
> $status_criterion->addAnd($c->getNewCriterion(MailDetailsPeer::CLASSIFICATION,
> > > > 2 , Criteria::BINARY_AND));
> >
> > > > As you can see I have no negation on the second-line because I do not
> > > know
> > > > how I should do that. There aren't any obvious options as part of
> Propel.
> >
> > > > ANy help would be appreciated guys :)
> >
> > > > --
> > > > Gareth McCumskeyhttp://garethmccumskey.blogspot.com
> > > > twitter: @garethmcc
> >
> > --
> > Gareth McCumskeyhttp://garethmccumskey.blogspot.com
> > twitter: @garethmcc
> >
>


-- 
Gareth McCumskey
http://garethmccumskey.blogspot.com
twitter: @garethmcc

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"symfony users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/symfony-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to